Mais ecoando os conselhos de Mike e Alex e adicionando minha própria cor ...
Usar atributos de instância é o típico ... o Python mais idiomático. Os atributos de classe não são usados tanto quanto os casos de uso são específicos. O mesmo vale para métodos estáticos e de classe vs. métodos "normais". Eles são construções especiais que abordam casos de uso específicos; caso contrário, é um código criado por um programador aberrante que deseja mostrar que conhece algum canto obscuro da programação em Python.
Alex menciona em sua resposta que o acesso será (um pouco) mais rápido devido a um nível a menos de pesquisa ... deixe-me esclarecer mais para quem ainda não sabe como isso funciona. É muito semelhante ao acesso variável - cuja ordem de pesquisa é:
- locais
- não-locais
- globais
- embutidos
Para acesso ao atributo, o pedido é:
- instância
- classe
- classes base, conforme determinado pelo MRO (ordem de resolução do método)
Ambas as técnicas funcionam de maneira "de dentro para fora", o que significa que os objetos mais locais são verificados primeiro e as camadas externas são verificadas sucessivamente.
No seu exemplo acima, digamos que você esteja procurando o path
atributo. Quando encontrar uma referência como " self.path
", o Python examinará os atributos da instância primeiro para uma correspondência. Quando isso falha, verifica a classe da qual o objeto foi instanciado. Por fim, ele pesquisará as classes base. Como Alex afirmou, se o seu atributo for encontrado na instância, ele não precisará procurar em outro lugar, portanto, você economizará um pouco de tempo.
No entanto, se você insistir nos atributos da classe, precisará dessa pesquisa extra. Ou , sua outra alternativa é se referir ao objeto por meio da classe em vez da instância, por exemplo, em MyController.path
vez deself.path
. Essa é uma pesquisa direta que contorna a pesquisa adiada, mas, como alex menciona abaixo, é uma variável global; portanto, você perde aquele pedaço que pensou em salvar (a menos que crie uma referência local ao nome da classe [global] )
A conclusão é que você deve usar atributos de instância na maioria das vezes. No entanto, haverá ocasiões em que um atributo de classe é a ferramenta certa para o trabalho. O código que usa os dois ao mesmo tempo exigirá a maior diligência, pois o uso self
apenas fornecerá o objeto de atributo da instância e sombreia o acesso ao atributo de classe com o mesmo nome. Nesse caso, você deve usar acessar o atributo pelo nome da classe para fazer referência a ele.