Je n'ai pas compris ce comportement, j'ai changé 'r' sur la classe 'f' et il est reflété sur "Q" Comme vous pouvez le voir "QR" indique qu'il fait maintenant référence à une fonction "Lambda", mais en même temps, l'adresse est toujours "0x037591f0" alors pourquoi "qr ()" est FAIN?
class f:
def r(self):
print('bla bla bla')
>>> q=f()
>>> f.r
<function f.r at 0x0378F4B0>
>>> q.r
<bound method f.r of <__main__.f object at 0x037591F0>>
>>> f.r=lambda : 'google'
>>> f.r
<function <lambda> at 0x015F9348>
>>> q.r
<bound method <lambda> of <__main__.f object at 0x037591F0>>
>>> q.r()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes 0 positional arguments but 1 was given
3 Réponses :
Tout d'abord, vous devez comprendre quelle est une méthode d'instance et comment cela fonctionne, N'oubliez pas que dans Python Les méthodes d'instance habitent dans la classe non dans l'objet pour cette raison pour cette raison, Python passe le paramètre Soi de manière implicite dans chaque méthode d'instance (de savoir quel objet appelle la méthode).
Dans votre exemple, la fonction Lambda ne reçoit aucun paramètre et vous n'utilisez pas le paramètre Auto, de sorte que la méthode doit être une méthode statique (méthode non liée) et non une méthode d'instance (méthode délimitée), autrement dit. Cette méthode "R" doit être liée à la classe et non à l'objet. p> Si toujours vous déroutant vous lisez sur les méthodes de classe, les méthodes statiques et les méthodes d'instance. < / p> p>
Dans votre cas, résultat: p> r code> ne démarre même pas comme une méthode statique, mais même s'il l'a fait, lorsque vous attribuez une Lambda à r code> sur la classe, Vous le remplacez et ce ne sera plus une méthode statique. Donc, lorsque Python l'appelle, il passera auto code> comme premier paramètre.
r code> est un attribut de classe dont la valeur est une fonction. Lorsque vous y accédez à partir d'une instance em> de la classe, vous ne recevez pas réellement la fonction de la fonction code> Retour: vous récupérez le résultat de la fonction __ obtenir __ Code> Méthode, qui est une nouvelle méthode code> objet. En outre, chaque accès de ce type crée un objet neuf em> objet code>, mais parce que cet objet est de courte durée (essentiellement, il existe assez longtemps pour être appelé, alors il est recueilli à la poubelle ), chaque nouvel objet peut utiliser la même mémoire que le précédent. P>
Bon ... cela semble être la réponse => ".__ obtenir__." . Merci mec
Vos deux méthodes liées n'existaient pas en même temps, c'est donc tout à fait possible (mais pas garantie, ou tout ce que vous devriez vous soucier de) que la seconde a réutilisé la même adresse mémoire que la première. Ils ne sont clairement pas le même objet, ils ont un nombre différent de paramètres pour une chose.
Votre Lambda ne prend pas
auto code> comme paramètre. Lorsque vous appelez une méthode via une instance (q.r () code>), "l'appelant" est inséré dans le paramètre "Self"@Michaelbianconi je sais cela, mais pourquoi l'adresse est la même que ce n'est pas le cas pour "F.R"
f code> est une classe etq code> est un objet.F.R () CODE> Agit en tant que staticmethod, mais lorsque vous appelezq.r () code>, q passe elle-même comme argument der code>.Lire le Descripteur comment guider . Il explique le protocole de descripteur, lequel
fonctionne code> est implémentée et explique pourquoi les méthodes se comportent comme ils le font. (Nommément, pourquoiq.r () code> etf.r (q) code> identique?)La réponse courte est la suivante: une fonction
code> -Valée attribue de classe accessible via une instance de la classe devrait prendre au moins un argument: l'instance qui a invoqué la fonction.