Observe que a melhor prática no Python 2.7 é usar classes de novo estilo (não necessárias no Python 3), ou seja,
class Foo(object):
...
Além disso, há uma diferença entre um 'objeto' e uma 'classe'. Para criar um dicionário a partir de um objeto arbitrário , é suficiente usá-lo __dict__
. Normalmente, você declarará seus métodos no nível da classe e seus atributos no nível da instância; portanto __dict__
, tudo bem. Por exemplo:
>>> class A(object):
... def __init__(self):
... self.b = 1
... self.c = 2
... def do_nothing(self):
... pass
...
>>> a = A()
>>> a.__dict__
{'c': 2, 'b': 1}
Uma abordagem melhor (sugerida por robert nos comentários) é a vars
função interna :
>>> vars(a)
{'c': 2, 'b': 1}
Como alternativa, dependendo do que você deseja fazer, pode ser bom herdar dict
. Então sua turma já é um dicionário e, se você quiser, pode substituir getattr
e / ou setattr
chamar e definir o ditado. Por exemplo:
class Foo(dict):
def __init__(self):
pass
def __getattr__(self, attr):
return self[attr]
# etc...
__dict__
não funcionará se o objeto estiver usando slots (ou definido em um módulo C).vars(a)
fazer isso? Para mim, é preferível invocar o__dict__
diretamente.__getattr__ = dict.__getitem__
exatamente para replicar o comportamento, então você também desejaria__setattr__ = dict.__setitem__
e__delattr__ = dict.__delitem__
por completo.Em vez disso
x.__dict__
, é realmente mais pitônico de usarvars(x)
.fonte
MyClass(**my_dict)
, assumindo que você definiu um construtor com parâmetros que espelham os atributos da classe. Não há necessidade de acessar atributos privados ou substituir o ditado.vars
função e introduzir funcionalidades adicionais sem alterar o próprio objeto.__slots__
embora.vars
para, ou seja, retornar um equivalente__dict__
para classes "com fenda". Por enquanto, ele pode ser emulado adicionando uma__dict__
propriedade que retorna{x: getattr(self, x) for x in self.__slots__}
(embora não tenha certeza se isso afeta o desempenho ou o comportamento).O
dir
builtin lhe dará todos os atributos do objeto, incluindo métodos especiais como__str__
,__dict__
e um monte de outras pessoas que você provavelmente não quer. Mas você pode fazer algo como:Portanto, você pode estender isso para retornar apenas atributos de dados e não métodos, definindo sua
props
função assim:fonte
ismethod
não pega funções. Exemplo:inspect.ismethod(str.upper)
.inspect.isfunction
não é muito mais útil, no entanto. Não sei como abordar isso imediatamente.Eu resolvi com uma combinação de ambas as respostas:
fonte
staticmethod
? Não écallable
.Eu pensei que levaria algum tempo para mostrar como você pode traduzir um objeto para ditar via
dict(obj)
.A seção principal deste código é a
__iter__
funçãoComo os comentários explicam, a primeira coisa que fazemos é pegar os itens de classe e impedir qualquer coisa que comece com '__'.
Depois de criar isso
dict
, você poderá usar aupdate
função dict e passar na instância__dict__
.Isso fornecerá um dicionário completo de classe + instância de membros. Agora, tudo o que resta é iterar sobre eles e gerar os retornos.
Além disso, se você planeja usar muito isso, pode criar um
@iterable
decorador de classe.fonte
dict((x, y) for x, y in KpiRow.__dict__.items() if x[:2] != '__' and not callable(y))
vai resolver isso? Mas ainda pode haverstatic
métodos :( #Isso perde atributos que o objeto herda de sua classe. Por exemplo,
hasattr (a, 'x') é verdadeiro, mas 'x' não aparece em um .__ dict__
fonte
vars()
que não funcionadir
é a solução neste caso. Veja a outra resposta sobre isso.Resposta tardia, mas prevendo a integridade e o benefício dos googlers:
Isso não mostrará os métodos definidos na classe, mas ainda mostrará os campos, incluindo aqueles atribuídos a lambdas ou aqueles que começam com um sublinhado duplo.
fonte
Eu acho que a maneira mais fácil é criar um atributo getitem para a classe. Se você precisa escrever para o objeto, você pode criar um personalizado setattr . Aqui está um exemplo para getitem :
O dict gera os atributos dos objetos em um dicionário e o objeto de dicionário pode ser usado para obter o item que você precisa.
fonte
Uma desvantagem do uso
__dict__
é que é raso; não converterá nenhuma subclasse em dicionários.Se você estiver usando Python3.5 ou superior, poderá usar
jsons
:fonte
Se você deseja listar parte de seus atributos, substitua
__dict__
:Isso ajuda muito se você
instance
obtém alguns dados de bloco grandes e deseja enviard
para o Redis como uma fila de mensagens.fonte
__dict__
é um atributo, não um método, portanto, este exemplo altera a interface (ou seja, você precisa chamá-la como chamadora), para que não a substitua.PITÃO 3:
Agora você pode usar o código acima dentro de sua própria classe:
fonte
vars()
é ótimo, mas não funciona para objetos aninhados de objetosConverta objetos aninhados de objetos em ditado:
fonte