0
votes

choses que je ne comprends pas en python. Méthode délimitée agissant comme un étranger

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


6 commentaires

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 comme paramètre. Lorsque vous appelez une méthode via une instance ( q.r () ), "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 est une classe et q est un objet. F.R () Agit en tant que staticmethod, mais lorsque vous appelez q.r () , q passe elle-même comme argument de r .


Lire le Descripteur comment guider . Il explique le protocole de descripteur, lequel fonctionne est implémentée et explique pourquoi les méthodes se comportent comme ils le font. (Nommément, pourquoi q.r () et f.r (q) identique?)


La réponse courte est la suivante: une fonction -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.


3 Réponses :


0
votes

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

Si toujours vous déroutant vous lisez sur les méthodes de classe, les méthodes statiques et les méthodes d'instance. < / p>


0 commentaires

0
votes

Dans votre cas, r 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 sur la classe, Vous le remplacez et ce ne sera plus une méthode statique. Donc, lorsque Python l'appelle, il passera auto comme premier paramètre. xxx

résultat: xxx


0 commentaires

1
votes

r est un attribut de classe dont la valeur est une fonction. Lorsque vous y accédez à partir d'une instance de la classe, vous ne recevez pas réellement la fonction de la fonction Retour: vous récupérez le résultat de la fonction __ obtenir __ Méthode, qui est une nouvelle méthode objet. En outre, chaque accès de ce type crée un objet neuf objet , 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.


1 commentaires

Bon ... cela semble être la réponse => ".__ obtenir__." . Merci mec