positional - static class python
¿A qué se refiere el "yo" en un @classmethod? (4)
El objeto de clase se pasa como el primer parámetro. Por ejemplo:
class Foo(object):
@classmethod
def bar(self):
return self()
Devolvería una instancia de la clase Foo.
EDITAR :
Tenga en cuenta que la última línea sería self () no self. self devolvería la clase en sí, mientras que self () devolvería una instancia.
Pensé que estaba empezando a comprender el "modo Python" de programación. Los métodos de una clase se aceptan a sí mismos como el primer parámetro para referirse a la instancia de la clase cuyo contexto se está llamando al método. El decorador @classmethod se refiere a un método cuya funcionalidad está asociada a la clase, pero que no hace referencia a un instancia específica.
Entonces, ¿a qué se refiere el primer parámetro de un @classmethod (canónicamente ''self'') si el método debe llamarse sin una referencia de instancia?
El primer parámetro de un método de clase se denomina cls
por convención y se refiere al objeto de clase en el que se invocó el método .
>>> 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
Un método de clase recibe la clase como primer argumento implícito, al igual que un método de instancia recibe la instancia.
class C:
@classmethod
def f(cls):
print(cls.__name__, type(cls))
>>> C.f()
C <class ''type''>
y es cls
canónicamente, por cierto
Django hace algunas cosas extrañas con un método de clase aquí:
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()
...
Aunque get_default_prefix se declara de esta manera (en la misma clase):
@classmethod
def get_default_prefix(cls):
return ''form''