J'ai été confondu par ce aussi bien pour un bon moment et je ne crois pas que la raison pour laquelle cela a eu beaucoup à faire avec la souvent prononcé explicite est mieux qu'implicite , mais que c'est seulement à la suite d'une simple analogie.
Prenons un simple vecteur de la classe:
class Vector(object):
def __init__(self, x, y):
self.x = x
self.y = y
Maintenant, nous voulons avoir une méthode qui calcule la longueur. Que se passerait-il si nous voulions définir à l'intérieur de la classe?
def length(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
Et, ce qui devrait ressembler lorsque nous étions à la définir comme une méthode globale/fonction?
def length_global(vector):
return math.sqrt(vector.x ** 2 + vector.y ** 2)
Ainsi, l'ensemble de la structure reste la même. Maintenant, comment pouvons-moi de rendre l'utilisation de ce? Si nous supposons pour un moment que nous n'avions pas écrit une length
méthode pour notre Vector
classe, on peut faire ceci:
Vector.length_new = length_global
v = Vector(3, 4)
print v.length_new() # 5.0
Cela fonctionne, parce que le premier paramètre de l' length_global
, peut être ré-utilisé comme self
paramètre en length_new
. Ce ne serait pas possible sans une explicite self
.
Une autre manière de comprendre la nécessité pour l'explicite self
est de voir où Python ajoute du sucre syntaxique. Lorsque vous gardez à l'esprit, que, fondamentalement, un appel comme
v_instance.length()
est transformée en interne
Vector.length(v_instance)
il est facile de voir où l' self
correspond. Vous ne vous sentez pas à l'écriture de méthodes d'instance en Python, ce que vous écrivez est les méthodes de la classe qui (doit) avoir une instance en tant que premier paramètre. Et donc, vous aurez à placer l'instance paramètre quelque part de manière explicite.