Un programmeur Java a étudié Python. (À propos des décorateurs)

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)

Qu'est-ce qu'un décorateur?

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?

Comment utiliser?

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é.

Qu'est-ce que Syntax Sugar?

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 ...

Que fait le décorateur en interne?

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 ~~

Décorateur standard Python

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.

Impressions

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.

Site de référence

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

Un programmeur Java a étudié Python. (À propos des décorateurs)
Un programmeur Java a étudié Python. (À propos du type)
Un programmeur Java a étudié Python. (À propos des fonctions (méthodes))
Un programmeur Java a étudié Python. (for, if, while instruction)
[Python] Qu'est-ce que @? (À propos des décorateurs)
En pensant à la journalisation, alors
Un programmeur Java a étudié Python. (À propos du type)
Écrire une note sur la version python de python virtualenv
Un mémorandum sur la bibliothèque de wrapper Python tesseract
Points Python du point de vue d'un programmeur en langage C
Un mémorandum sur la mise en œuvre des recommandations en Python
À propos du module Python venv
À propos de la fonction enumerate (python)
Mémorandum sur la corrélation [Python]
Un mémorandum sur le simulacre de Python
À propos des fonctionnalités de Python
Une note sur [python] __debug__
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Python: une note sur les classes 1 "Résumé"
[Python] Faire de la fonction une fonction lambda
Créer un framework de décorateur à usage général pour Python
À propos de la liste de base des bases de Python
Une note sur mock (bibliothèque fictive Python)
Un peu plus sur les références ~ Prenant Python et Java comme exemples ~
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Après avoir fait des recherches sur la bibliothèque Python, j'ai un peu compris egg.info.
Créer un décorateur de fonction Python avec Class
[Python Kivy] À propos de la modification du thème de conception
Ecrire le test dans la docstring python
À propos de l'environnement virtuel de Python version 3.7
Rechercher le labyrinthe avec l'algorithme python A *
Apprenez le modèle de conception "Décorateur" avec Python
Exécuter l'interpréteur Python dans le script
[Python] Résumez les éléments rudimentaires du multithreading
[python] [meta] Le type de python est-il un type?
Une histoire sur Python pop and append
L'histoire du traitement A du blackjack (python)
[Python] Une barre de progression sur le terminal
[Python] Un programme qui arrondit le score
À propos du 02 février 2020 * Ceci est un article Python.
Un mémo que j'ai essayé le tutoriel Pyramid
[Python] Récupérez les fichiers dans le dossier avec Python
Création d'un wrapper Python pour l'API Qiita
Récupérer l'appelant d'une fonction en Python
ffmpeg-Construisez un environnement python et divisez la vidéo
J'ai écrit une classe en Python3 et Java
Copiez la liste en Python
Pourquoi je suis une boutique Java et démarre Python
À propos de la différence entre "==" et "is" en python
Un mémo que j'ai écrit un tri de fusion en Python
Python: préparez un sérialiseur pour l'instance de classe:
Analyse de données en Python: une note sur line_profiler
Une histoire sur l'exécution de Python sur PHP sur Heroku
Pensez à créer un environnement Python 3 dans un environnement Mac
[Note] À propos du rôle du trait de soulignement "_" en Python
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
Une note sur la nouvelle classe de base de style
amateur python tente de résumer la liste ②
[Python] Trouvez la matrice de translocation en notation d'inclusion