IC # fazemos isso através da reflexão. Em Javascript é simples como:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Como fazer isso em Python?
python
reflection
properties
Jader Dias
fonte
fonte
@property
.Respostas:
Esteja ciente de que em alguns casos raros existe uma
__slots__
propriedade, essas classes geralmente não têm__dict__
.fonte
__setattr__()
. Definir valores diretamente no dicionário ignora o criador do objeto (e / ou o de seus pais). É bastante comum em python que mais coisas do que aparentam estar acontecendo em segundo plano durante a configuração de atributos (por exemplo, saneamento), o usosetattr()
garante que você não perca, ou seja forçado a lidar com eles explicitamente.vars()
retorna apenas membros estáticos (ou seja, atributos e métodos de objetos registrados nos objetos__dict__
). Ele não retorna membros dinâmicos (isto é, atributos e métodos de objetos definidos dinamicamente pelo__getattr__()
método desse objeto ou magia semelhante). Com toda a probabilidade, suafile.ImplementationName
propriedade desejada é definida dinamicamente e, portanto, não está disponível paravars()
oudir()
.Veja
inspect.getmembers(object[, predicate])
.fonte
attributes
vez demembers
(existe alguma diferença entre os dois?). Eles poderiam ter corrigido o nome no Python 3.0 para torná-lo consistente.__dict__
, desculpe.inspect.getmembers()
encerradir()
os benefícios colaterais (principalmente desprezíveis) de (A), incluindo atributos de classe dinâmica e atributos de metaclasse e (B) excluindo membros que não correspondem ao predicado passado. Bocejo, certo?inspect.getmembers()
é apropriado para bibliotecas de terceiros que oferecem suporte genericamente a todos os tipos de objetos possíveis. Para casos de uso padrão, no entanto,dir()
é absolutamente suficiente.dir()
é a maneira simples. Veja aqui:Guia para introspecção em Python
fonte
dir()
agradecer.A
__dict__
propriedade do objeto é um dicionário de todas as suas outras propriedades definidas. Observe que as classes Python podem substituir o getattr e criar coisas que parecem propriedades, mas não estão presentes__dict__
. Há também as funções internasvars()
edir()
que são diferentes de maneiras sutis. E__slots__
pode substituir__dict__
em algumas classes incomuns.Objetos são complicados em Python.
__dict__
é o lugar certo para começar a programação no estilo de reflexão.dir()
é o lugar para começar se você estiver navegando em um shell interativo.fonte
print vars.__doc__
indica queWith an argument, equivalent to object.__dict__
Então, quais seriam as diferenças sutis?georg scholly versão mais curta
fonte
Se você está procurando um reflexo de todas as propriedades, as respostas acima são ótimas.
Se você simplesmente deseja obter as chaves de um dicionário (que é diferente de um 'objeto' no Python), use
my_dict.keys()
fonte
obj['key']
vs.obj.property
) e a pergunta era sobre propriedades de objetos. Coloquei minha resposta aqui, porque há uma confusão fácil entre os dois.Isso é totalmente coberto pelas outras respostas, mas vou explicitar. Um objeto pode ter atributos de classe e atributos de instância estáticos e dinâmicos.
stasis
é estático,dyno
dinâmico (cf. decorador de propriedades) eclassy
é um atributo de classe. Se simplesmente fizermos__dict__
ouvars
conseguiremos apenas a estática.Então, se quisermos, os outros
__dict__
receberão tudo (e mais). Isso inclui métodos e atributos mágicos e métodos vinculados normais. Então, vamos evitar os seguintes:O
type
chamado com um método decorado de propriedade (um atributo dinâmico) fornecerá o tipo do valor retornado, nãomethod
. Para provar isso, vamos definir o json:Se tivesse sido um método, teria colidido.
TL; DR. tente chamar
extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
todos os três, mas não métodos nem magia.fonte