¿Para qué se usa la variable 'cls' en las clases de Python?

270

¿Por qué a clsveces se usa en lugar de selfcomo argumento en las clases de Python?

Por ejemplo:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)
Scaraffe
fuente

Respuestas:

293

La distinción entre "self"y "cls"se define en PEP 8. Como dijo Adrien, esto no es obligatorio. Es un estilo de codificación. PEP 8dice:

Argumentos de función y método :

Utilice siempre selfpara el primer argumento los métodos de instancia.

Siempre use clspara el primer argumento de los métodos de clase.

Baskaya
fuente
56

Se usa en caso de un método de clase. Consulte esta referencia para más detalles.

EDITAR: según lo aclarado por Adrien, es una convención. En realidad, puede usar cualquier cosa menos clsy selfse utilizan ( PEP8 ).

Juho Vepsäläinen
fuente
52

clsimplica que el método pertenece a la clase, mientras que self implica que el método está relacionado con la instancia de la clase, por lo tanto, clsse accede al miembro with por nombre de clase, mientras que al que se accede a uno mismo por instancia de la clase ... es el mismo concepto como static membery non-static membersen java si eres de fondo java.

abdilatif bashir
fuente
1
Gracias por la referencia de Java, ahora entiendo.
Edenshaw
Gracias por la mención static membery non-static members, entendido en el contexto de c ++
Amit JS
18

Esta es una muy buena pregunta, pero no tan deseosa como la pregunta. Hay una diferencia entre el método usado 'self' y 'cls' aunque analógicamente están en el mismo lugar

def moon(self, moon_name):
    self.MName = moon_name

#but here cls method its use is different 

@classmethod
def moon(cls, moon_name):
    instance = cls()
    instance.MName = moon_name

Ahora puede ver que ambas son funciones lunares, pero una se puede usar dentro de la clase, mientras que otra función se puede usar para cualquier clase.

Para un enfoque práctico de programación:

Al diseñar la clase de círculo, utilizamos el método de área como cls en lugar de self porque no queremos que el área se limite solo a una clase particular de círculo.

El exorcista
fuente
si desea agregar algo más que los codificadores que buscan, si es correcto, lo aprobarán.
TheExorcist
2

En lugar de aceptar un parámetro propio, los métodos de clase toman un parámetro cls que apunta a la clase, y no a la instancia del objeto, cuando se llama al método. Dado que el método de clase solo tiene acceso a este argumento cls, no puede modificar el estado de la instancia del objeto . Eso requeriría acceso a uno mismo. Sin embargo, los métodos de clase aún pueden modificar el estado de la clase que se aplica en todas las instancias de la clase.

- Trucos de Python

Autenticigh
fuente