tutorial positional missing method argument python self class-method

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


clase en sí :

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