Quero substituir o __getattr__
método em uma classe para fazer algo sofisticado, mas não quero interromper o comportamento padrão.
Qual é a maneira correta de fazer isso?
python
getattr
getproperty
sheats
fonte
fonte
Respostas:
A substituição
__getattr__
deve estar correta -__getattr__
é chamada apenas como último recurso, ou seja, se não houver atributos na instância que correspondam ao nome. Por exemplo, se você acessarfoo.bar
,__getattr__
somente será chamado sefoo
não tiver nenhum atributo chamadobar
. Se o atributo for um que você não deseja manipular, aumenteAttributeError
:No entanto, ao contrário
__getattr__
,__getattribute__
será chamado primeiro (funciona apenas para novas classes de estilo, ou seja, aquelas que herdam do objeto). Nesse caso, você pode preservar o comportamento padrão da seguinte maneira:Veja a documentação do Python para mais .
fonte
__getattr__
- tem alguma idéia do que fazer? (AttributeError: 'super' object has no attribute '__getattr__'
)AttributeError
sem o contexto do atributo nos argumentos da exceção.fonte
self.__class__.__name__
deve ser usado em vez deself.__class__
no caso das substituições de classe__repr__
Para estender a resposta do Michael, se você deseja manter o comportamento padrão usando
__getattr__
, é possível:Agora a mensagem de exceção é mais descritiva:
fonte
__getattr__
e__getattribute__
?