Je suis un programmeur Java qui a commencé à étudier Python avec élan car je suis à court de messages en Java.
Cette fois, j'étudierai le décorateur que j'ai omis car je ne pouvais pas le comprendre la dernière fois. Cliquez ici pour consulter les articles d'études antérieures. À propos des instructions if, for, while À propos du type (À propos des fonctions (méthodes)
Dans Samurai Engineer School, il était écrit comme suit.
Un décorateur est une fonction permettant d'ajouter ou de modifier le traitement d'une fonction existante.
Les décorateurs vous permettent d'ajouter ou de modifier des fonctionnalités à des fonctions existantes sans avoir à les modifier directement.
Par exemple, si vous avez une fonction et que vous souhaitez modifier le comportement de la fonction par traitement, vous pouvez éviter de créer une fonction similaire pour chaque traitement.
Est-ce un remplacement en Java? Remplacer, c'est comme redéfinir ou recréer une méthode, est-ce donc un peu différent de l'ajout ou de la modification?
La syntaxe de base est
@Nom du décorateur
En Java, @ est utilisé comme une annotation. J'ai regardé un exemple de code, mais tous ont été définis sur la fonction (def).
Voici une copie de l'exemple de code ici.
def decorateSample(myfunc):
print("Hello Decorator")
@decorateSample
def myfunc():
print("Test")
Quand j'ai fait cela, j'ai obtenu la sortie "Hello Decorator". Par ailleurs, "Test" n'est pas sorti. Le but est de définir le nom de la fonction qui utilise le décorateur comme argument.
pass signifie "ne rien faire". Est-ce ";" ou "return;" en Java?
C'est l'une des syntaxes appelées sucre de syntaxe (syntaxe d'enrobage de sucre). ~~ C'est un nom délicieux. ~~ J'étais nouveau dans le mot sucre de syntaxe, donc j'ai dévié un peu, mais j'ai cherché.
Il y avait une page normale dans Wikipedia. Je pensais que c'était un nom de syntaxe spécifique à Python, mais ce n'était pas le cas.
Il est possible d'écrire quelque chose qui a exactement la même signification qu'un style d'écriture compliqué et difficile à comprendre dans un style d'écriture plus simple et plus facile à comprendre.
Il semble que la syntaxe soit abrégée. Donc, si vous l'exprimez en Java,
//Une écriture qui n'est pas du sucre de syntaxe
String[] strs = new String[2];
strs[0] = "abc";
strs[1] = "def";
//Écriture de syntaxe de sucre
String[] strs = {"abc", "def"};
à propos de ça. Le fait que "Hello Decorator" soit sorti même si la fonction n'est pas appelée est appelé sucre de syntaxe. Je suis gêné de ne pas savoir ...
Le code Python mentionné ci-dessus est, après tout,
def decorateSample(myfunc):
print("Hello Decorator")
def myfunc():
print("Test")
myfunc = decorateSample(myfunc)
Semble faire.
myfunc = decorateSample(myfunc)
Que fais-tu ici? ?? Attribuer le contenu de la fonction decorateSample à myfunc? Remplacement? Avez-vous l'impression de le faire? Alors, cela signifie-t-il que "Test" n'est pas sorti et "Hello Decorator" est sorti? ~~ J'ai été frustré par mon manque de compréhension ~~
Python est livré avec des décorateurs standard. Il semble qu'il existe trois types de décorateurs courants qui sont souvent utilisés.
Regardons chacun d'eux.
classmethod
Je l'ai utilisé comme référence (http://st-hakky.hatenablog.com/entry/2017/11/15/155523).
Une méthode de classe est une méthode définie dans une classe qui peut être appelée sans instanciation. Ceci est utilisé lors de la définition d'une méthode qui fait quelque chose avec la classe elle-même, pas l'instance.
Mmm ... Avant de chercher, j'ai pensé "méthode d'instance Java" = "méthode de classe Python", mais cela semble différent.
La façon habituelle d'écrire une méthode en Python est l'image suivante (méthode d'instance en Java?)
class SampleClass:
def hello_world(self):
print("Hello World!")
#Instancier et méthode d'appel
sample_class = SampleClass()
sample_class.hello_world()
Qu'est-ce que le moi! Cependant, il semble que cela signifie «ceci» en Java.
Vous pouvez maintenant utiliser @classmethod pour l'appeler sans avoir à l'instancier comme ci-dessus.
class SampleClass:
@classmethod
def hello_world(cls):
print("Hello World!")
#Appeler la méthode telle quelle
SampleClass.hello_world()
Il est habituel de changer de soi en cls. Notez que le nom du premier argument est différent entre la méthode normale et la méthode de classe. (Puisque la méthode de classe reçoit la classe comme premier argument, elle semble être nommée cls ...)
Il semble que la méthode de classe puisse être réalisée en utilisant la fonction classmethod (), mais ce n'est pas recommandé. J'ai donc omis cette fois.
staticmethod
Similaire à la méthode de classe, citée de ce site.
En bref, il existe les différences suivantes. -Staticmethod: Cela fonctionne quelle que soit la classe même si elle est définie dans la classe, et ne considère que l'argument reçu. En gros, ce n'est pas différent d'une simple fonction. -Classmethod: Cela peut prendre la classe elle-même comme argument et l'utiliser avec l'argument reçu
La méthode statique semble être une méthode qui ne nécessite pas d'instanciation et ne prend aucun argument. "C'est tout. Ensuite, vous pouvez utiliser une fonction normale. Quand dois-je l'utiliser?"
Apparemment, le comportement de la classe héritée est différent. Vous trouverez ci-dessous un autre code qui imite l'exemple de code.
class ParentClass():
str = 'Hello, I am Parent Class'
@classmethod
def class_method(cls):
print('class_method: ' + cls.str)
@staticmethod
def static_method():
print('static_method: '+ ParentClass.str)
class ChildClass(ParentClass):
str = 'Hello, I am Child Class'
ChildClass.class_method() #Résultat de l'exécution: classe_method: Hello, I am Child Class
ChildClass.static_method() #Résultat d'exécution: statique_method: Hello, I am Parent Class
Même si la classe enfant appelle static_method (), elle appelle toujours la classe parent. La méthode de classe passe à la destination de référence lorsque l'héritage est effectué. Je veux utiliser la méthode statique lorsque le comportement ne change pas, même dans les classes enfants. Il paraît que.
Java a également un nom appelé méthode statique, mais il semble que vous deviez faire attention car le comportement lors de l'héritage est différent.
property
Également cité sur Site de référence.
Les classes Python peuvent généralement lire et écrire directement dans les propriétés (attributs). Self est défini comme un argument de la méthode init qui est exécutée lorsque la classe est créée, n'est-ce pas? Une propriété est une variable sous la forme de "self. ~". Avec @property, la fonction décorée avec ce décorateur devient une propriété lisible appelée getter. Être capable de lire uniquement signifie que vous ne pouvez pas modifier de nouvelles valeurs.
Quoi? (´ ・ ω ・ `)? J'ai pensé, je l'ai relu environ 5 fois.
Est-ce un décorateur utilisé uniquement pour le getter? getter est appelé en Java
public String getter() {
return this.hoge;
}
Quelque chose comme ca? e? Alors qu'en est-il du décorateur setter?
Quelle est la méthode init! Quand je l'ai recherché, c'était ** constructeur **. Je vois.
Alors, revoyons-le,
class SampleClass(object):
def __init__(self, hoge):
self.__hoge = hoge
@property
def getter(self):
return self.__hoge
#Instancier et méthode d'appel
sample_class = SampleClass(1234)
x = sample_class.getter
print(x) #Résultat de l'exécution: 1234
Donc, le setter qui m'intéressait était
class SampleClass(object):
def __init__(self, hoge):
self._hoge = hoge
@property
def hoge(self):
return self._hoge
@hoge.setter
def hoge(self, hoge):
self._hoge = hoge
#Instancier et méthode d'appel
sample_class = SampleClass(1234)
x = sample_class.hoge
print(x) #Résultat de l'exécution: 1234
sample_class.hoge = 5678
x = sample_class.hoge
print(x) #Résultat de l'exécution: 5678
Il est important de faire correspondre le nom de la méthode avec celui avec @property, qui est un getter. (Je ne comprenais pas ça et j'en étais assez accro ...) Créez-le avec un nom tel que @ propertyname.setter.
Je le comprends en tant que concept, mais je ne sais pas comment bien l'utiliser. Je pense que c'est probablement parce que je ne comprends pas le comportement détaillé.
S'il n'y a pas de fonction similaire à Java, je crains que ma compréhension ne baisse. Je n'ai pas eu beaucoup de problèmes avec PHP et C #, donc je suis un peu déçu ... ou plutôt frustré ...
Je fais un salon du livre technique informatique sur Amazon, donc je vais acheter un bon livre Python. Pour l'instant, je me demande si c'est facile à lire s'il s'agit d'une application WEB ou d'une programmation de jeu.
"Arrête ça!" "Je n'ai pas besoin d'un livre! Le site Web suffit!" Si vous avez une opinion telle que "Si vous êtes un débutant, c'est définitivement ce livre!", Je vous serais reconnaissant de bien vouloir me le faire savoir.
https://www.sejuku.net/blog/25130 http://st-hakky.hatenablog.com/entry/2017/11/15/155523 https://kiwamiden.com/how-to-use-property-decorator http://nametake-1009.hatenablog.com/entry/2015/10/21/222829
Recommended Posts