python (2) nécessite self car la méthode est une méthode d'instance

Il semble qu'il soit populaire de parler de soi de python2 / 3. J'essaye aussi d'infuser la fraîcheur.

class class1(object):
    def method1(self):
        pass

Vous pouvez exécuter ce script tel quel, mais je vous recommande d'essayer diverses choses avec repl. Ce script fonctionne à la fois avec python2 / 3, mais avec la sortie de python2 (car il est un peu plus primitif et intuitif, je l'ai également inclus.

Objet de classe

Les débutants sont confus, mais en python, seule class1 peut être appelée un "objet de classe". Cette classe 1 peut être confirmée avec repl. type (class1) == "type".

print(class1)  # <class '__main__.class1'>
print(type(class1))  # <type 'type'>

Cela se distingue clairement dans docs.python.

9 . Classes - Documentation Python 3 \ .8 \ .3

En d'autres termes, ce qui était vu dans la "définition de classe" était, à proprement parler, la création d'une instance de type de type.

méthode de

Si vous essayez quelques répls pour class1 ici, vous pouvez voir que method1 peut être appelée même dans cet état. Ceux-ci sont de type instancemethod et ne sont pas liés. Autrement dit, il n'est pas lié à une instance.

print(callable(class1))  # True
print(callable(class1.method1))  # True

print(class1.method1)  # <unbound method class1.method1>
print(type(class1.method1))  # <type 'instancemethod'>

Par conséquent, dans cet état, il est nécessaire de spécifier self pour spécifier l'instance.

Objet d'instance

Créez une instance.

instance1 = class1()
print(instance1)  # <__main__.class1 object at 0x7f19f6368910>

instance1 est appelée un objet d'instance.

9 . Classes - Documentation Python 3 \ .8 \ .3

méthode de

Qu'arrive-t-il à method1 dans instance1?

print(instance1.method1) # <bound method class1.method1 of <__main__.class1 object at 0x7f19f6368910>>
print(callable(instance1.method1))  # True
print(type(instance1.method1)) # <type 'instancemethod'>
print(instance1.method1 == class1.method1) # True

C'est toujours une méthode d'instance, mais quand je regarde repl, elle est liée. Puisqu'il est appelé via l'objet instance, il est clair que == bound est lié à instance1.

Dans cette condition, python2 / 3 complète le premier argument sans autorisation. Cela devient soi-même. Voilà pourquoi.

Au fait, c'est juste une convention pour nommer ce «soi», et «cela» fonctionne très bien.

Peut être remplacé

Comme la fonction python n'est qu'une méthode d'instance, elle peut être affectée en dehors de la classe / instance.

func1 = instance1.method1
print(func1) # <bound method class1.method1 of <__main__.class1 object at 0x7f4b663e6910>>

Dans l'expression à droite, il est clair que instance1 est liée, donc func1 peut être appelée sans argument.

Et moi

Comme mentionné ci-dessus

Les deux sont du type de méthode d'instance en interne et le comportement du côté de la fonction n'a pas changé. L'appelant ajuste le livre.

Comme il est rare d'appeler directement class1.method1, il est nécessaire d'ajouter self en prévision de l'exécution à partir de l'objet instance.

Méthodes statiques et méthode de classe

Bien sûr, il existe également des méthodes statiques dans d'autres langages. Vous pouvez supprimer les arguments de méthode, mais il existe un moyen plus sûr. C'est un décorateur de méthode de classe.


class class2(object):
    def method1(cls):
        print(cls)

    @classmethod
    def method2(cls):
        print(cls)


print(class2.method1)  # <unbound method class2.method1>
print(class2.method2)  # <bound method type.method2 of <class '__main__.class2'>>

Au stade de classe2, la méthode2 est déjà liée à la classe2. Ceci est toujours disponible lorsqu'il est appelé depuis une instance.

instance2 = class2()
print(instance2.method1) # <bound method class2.method1 of <__main__.class2 object at 0x7f33073ed950>>
print(instance2.method2) # <bound method type.method2 of <class '__main__.class2'>>

Mais moi

Que diriez-vous sur la base de ce qui précède? Le moi, que je trouvais gênant, ne semble-t-il pas très important?

Recommended Posts

python (2) nécessite self car la méthode est une méthode d'instance
Python est une instance
Pourquoi le premier argument de la classe [Python] est-il self?
Python est un langage pour adultes
Qu'est-ce qu'une variable d'instance?
J'ai eu un AttributeError en me moquant de la méthode ouverte en python
[Python] Qu'est-ce que @? (À propos des décorateurs)
[python] Quelle est la clé triée?
À quoi sert le trait de soulignement Python (_)?
Python> Qu'est-ce qu'une tranche étendue?
Python in est aussi un opérateur
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
Où est écrit le processus d'instanciation python?
Installer Anaconda Python sur une instance ECS
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Le nombre est-il équivalent à un entier?
[python] [meta] Le type de python est-il un type?
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
La réponse de "1/2" est différente entre python2 et 3
Qu'est-ce que wheezy dans l'image Docker Python?
Wagtail est le meilleur CMS pour Python! (Peut-être)
J'ai essayé la méthode des moindres carrés en Python
Pour remplacer dynamiquement la méthode suivante en python
Apprenez le modèle de conception "Méthode d'usine" en Python
À propos de la différence entre "==" et "is" en python
Python: préparez un sérialiseur pour l'instance de classe:
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
[Python] Prédire le loyer approprié pour les appartements
Ceci est le seul examen de base de Python ~ 3 ~
Essayez d'implémenter la méthode Monte Carlo en Python
[Python] Pensez sérieusement à la méthode gagnante M-1.
Un article résumant les pièges accro au python
Utilisation pour appeler une méthode d'une instance avant qu'elle ne soit renvoyée par __new__
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!