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