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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top