Je pensais que je commençais à maîtriser "la manière Python" de la programmation. Les méthodes d'une classe acceptent le self comme premier paramètre à se référer à l'instance de la classe dont le contexte est appelé dans la méthode. Le décorateur @classmethod fait référence à une méthode dont la fonctionnalité est associée à la classe, mais qui ne fait pas référence à un instance spécifique. Alors, à quoi fait référence le premier paramètre d'un @classmethod (canoniquement 'self') si la méthode doit être appelée sans référence d'instance?Qu'est-ce que 'self' se réfère à @classmethod?
Répondre
Une méthode de classe reçoit la classe comme premier argument implicite, comme une méthode d'instance reçoit l'instance.
class C:
@classmethod
def f(cls):
print(cls.__name__, type(cls))
>>> C.f()
C <class 'type'>
et il est cls
canoniquement, btw
L'objet de classe est transmis comme premier paramètre. Par exemple:
class Foo(object):
@classmethod
def bar(self):
return self()
Renvoyer une instance de la classe Foo.
EDIT:
Notez que la dernière ligne serait auto() non auto. self retourne la classe elle-même, tandis que self() renvoie une instance.
Ceci est correct, mais il est important de noter que 'cls' est plus communément utilisé comme premier paramètre d'un classmethod. – Lenna
Le premier paramètre d'un classmethod est nommé cls
par convention et fait référence à l'objet de classe sur lequel la méthode a été invoquée.
>>> class A(object):
... @classmethod
... def m(cls):
... print cls is A
... print issubclass(cls, A)
>>> class B(A): pass
>>> a = A()
>>> a.m()
True
True
>>> b = B()
>>> b.m()
False
True
Django fait des choses étranges avec une méthode de classe ici:
class BaseFormSet(StrAndUnicode):
"""
A collection of instances of the same Form class.
"""
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList):
...
self.prefix = prefix or self.get_default_prefix()
...
Même si get_default_prefix est déclarée de cette façon (dans la même classe):
@classmethod
def get_default_prefix(cls):
return 'form'
- 1. Quand vous dites que Ruby est réfléchissant, est-ce que cela se réfère principalement à "dactylographie"?
- 2. Comment se conformer à un protocole self-made?
- 3. Comment un objet se réfère-t-il dans Lua?
- 4. classmethod pour Tkinter-Monitor-Window
- 5. SidBySide: Dll 3ème partie se réfère à deux versions de MSVCR80.DLL
- 6. En Python, comment référencer une classe de manière statique, comme le mot-clé "self" de PHP?
- 7. Comment libérer self (UIImageView) dans touchesEnded?
- 8. [self release], [self dealloc] ou [super dealloc] dans les méthodes init?
- 9. Appeler un classmethod de la classe de base en Python
- 10. UIPickerView n'apparaît pas jusqu'à ce que le contact se produise
- 11. Une méthode de classe qui se comporte différemment lorsqu'elle est appelée en tant que méthode d'instance?
- 12. django sql se joindre à
- 13. Quel est l'avantage d'avoir ce pointeur/self obligatoire?
- 14. Se assurer que un « int » est lié à sqlite
- 15. Différences entre ElementName = "<Me>" et RelativeSource self?
- 16. wxWidgets ne se mettra pas à jour jusqu'à ce que la souris se déplace
- 17. Django: appliquer la contrainte "same parent" à ManyToManyField mappage à self
- 18. Une fenêtre se liant à soi?
- 19. Que fait votre équipe pour se démarquer?
- 20. SCardEstablishContext se bloque en tant que service
- 21. Que dois-je utiliser pour que les utilisateurs se connectent à mon application ASP.net?
- 22. Attendez que deux threads se terminent
- 23. Que se passe-t-il avec Zend?
- 24. Attendez jusqu'à ce que l'événement se produise
- 25. En utilisant $ this, self ::, parent :: pour la lisibilité du code
- 26. Impossible d'inclure "self" dans la méthode de description Objective-C?
- 27. (Ruby, Rails) Contexte de SELF dans les modules et bibliothèques ...?
- 28. Que se passe-t-il? gets()
- 29. Comment utiliser la méthode self class sur iPhone? (Question conceptuelle)
- 30. Pourquoi "self" dans les objets Python est-il immuable?
+1: Citation du documentation –