Por que os procedimentos de pesquisa para obter um atributo de uma classe e de uma instância são diferentes?
Python em poucas palavras descreve os procedimentos de pesquisa ao obter um atributo. O livro distingue dois casos
o procedimento de pesquisa ao obter um atributo de uma classe, por exemplocls.name
Obtendo um atributo de uma classe
Quando você usa a sintaxeC.name
para se referir a um atributo em um objeto de classeC
, a pesquisa prossegue em duas etapas:
Quandoname
é uma chaveC.__dict__
, C.name
busca o valorv
deC.__dict__['name']
. Então quandov
é um descritor (ou seja,type(v)
fornece um método chamado__get__
), o valor deC.name
é o resultado de chamartype(v).__get__(v, None, C)
. Quandov
não é um descritor, o valor deC.name is v
.
Quandoname
não é a chaveC.__dict__
, C.name
delega a pesquisa paraC
Classes básicas, o que significa queC
As classes ancestrais e tenta a pesquisa de nome em cada uma (na ordem de resolução do método, conforme abordado em "Ordem da resolução do método" na página 113).
o procedimento de pesquisa ao obter um atributo de uma instância, por exemploobj.name
Como no Python 3, todo objeto de classe é na verdade uma instância de sua metaclasse (por exemplo,type
class), de acordo com o livro, por que o procedimento de pesquisa para obter um atributo de uma classe e o procedimento de pesquisa para obter um atributo de uma instância diferente?