Obtenha objeto de classe __dict__ sem atributos especiais
-
20-09-2019 - |
Pergunta
Por obter todos os atributos de classe definidos, tento ir com
TheClass.__dict__
Mas isso também me dá os atributos especiais. Existe uma maneira de obter apenas os atributos autodefinidos ou tenho que "limpar" o ditado?
Solução
Outra solução:
class _BaseA(object):
_intern = object.__dict__.keys()
class A(_BaseA):
myattribute = 1
print filter(lambda x: x not in A._intern+['__module__'], A.__dict__.keys())
Eu não acho que isso seja terrivelmente robusto e ainda pode haver uma maneira melhor.
Isso aborda algumas das questões básicas que algumas das outras respostas apontaram para:
- Não há necessidade de
'name convention'
filtragem baseada em base - Fornecendo sua própria implementação de métodos mágicos, por exemplo
__len__
não há problema (defina em A).
Outras dicas
Você não pode limpar o __dict__
:
AttributeError: attribute '__dict__' of 'type' objects is not writable
Você poderia confiar Convenções de nomeação:
class A(object):
def __init__(self, arg):
self.arg = arg
class_attribute = "01"
print [ a for a in A.__dict__.keys()
if not (a.startswith('__') and a.endswith('__')) ]
# => ['class_attribute']
Isso pode não ser confiável, pois você pode, obviamente, substituir ou implementar Métodos especiais/mágicos Curti __item__
ou __len__
em sua classe.
Eu não acho que há algo simples e por que haveria? Não há diferença imponente de idioma entre os atributos mágicos e definidos pelo usuário.
A solução de Myyn não funcionará se você tiver um atributo definido pelo usuário começando com '__'. No entanto, ele sugere uma solução baseada em convenções: se você deseja introspectar suas próprias classes, pode definir sua própria convenção de nomenclatura e filtrar isso.
Talvez se você explicar a necessidade, podemos encontrar uma solução melhor.