2009-02-10 8 views
16

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

34

class itself:

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

+0

+1: Citation du documentation –

0

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.

+3

Ceci est correct, mais il est important de noter que 'cls' est plus communément utilisé comme premier paramètre d'un classmethod. – Lenna

12

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 
0

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' 
Questions connexes