Para que é usada a variável 'cls' nas classes Python?

270

Por que clsàs vezes é usado em vez de selfcomo argumento nas classes Python?

Por exemplo:

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
fonte

Respostas:

293

A distinção entre "self"e "cls"é definida em PEP 8. Como Adrien disse, isso não é obrigatório. É um estilo de codificação. PEP 8diz:

Argumentos de função e método :

Sempre use selfpara o primeiro argumento a instância de métodos.

Sempre use clspara o primeiro argumento os métodos de classe.

Baskaya
fonte
56

É usado no caso de um método de classe. Verifique esta referência para mais detalhes.

EDIT: Como esclarecido por Adrien, é uma convenção. Você pode realmente usar qualquer coisa, menos clse selfé usado ( PEP8 ).

Juho Vepsäläinen
fonte
52

clsimplica que o método pertence à classe, enquanto self implica que o método está relacionado à instância da classe, portanto, membro com clsé acessado pelo nome da classe, onde como aquele com self é acessado pela instância da classe ... é o mesmo conceito como static membere non-static membersem java se você é do fundo java.

abdilatif bashir
fonte
1
Obrigado pela referência de Java, agora entenda.
Edenshaw 10/02
Do que você pela menção static membere non-static members, entendeu no contexto de c ++
Amit JS
18

Essa é uma pergunta muito boa, mas não tão desejável quanto a pergunta. Existe diferença entre o método usado 'self' e 'cls', embora analogamente estejam no mesmo local

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

Agora você pode ver que ambas são função da lua, mas uma pode ser usada dentro da classe, enquanto outro nome da função moon pode ser usado para qualquer classe.

Para uma abordagem de programação prática:

Ao projetar a classe de círculo, usamos o método area como cls em vez de self, porque não queremos que a área seja limitada apenas a uma classe específica de círculo.

O Exorcista
fonte
se você quiser adicionar algo mais que os codificadores que procuram, se for o caso, o aprovarão.
TheExorcist
2

Em vez de aceitar um parâmetro próprio, os métodos de classe usam um parâmetro cls que aponta para a classe - e não para a instância do objeto - quando o método é chamado. Como o método de classe só tem acesso a esse argumento cls, ele não pode modificar o estado da instância do objeto . Isso exigiria acesso a si próprio. No entanto, os métodos de classe ainda podem modificar o estado da classe que se aplica a todas as instâncias da classe.

- Truques em Python

authentichigh
fonte