Existe uma maneira de pegar uma lista de atributos que existem nas instâncias de uma classe?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
O resultado desejado é que "multi, str" será exibido. Eu quero que isso veja os atributos atuais de várias partes de um script.
python
class
python-3.x
MadSc13ntist
fonte
fonte
NewClass
. Você pode desafiar as expectativas das pessoas se usar uma convenção de nomes comonew_class
.help()
função de ajuda para obter informações sobre as classes, funções, builtins, módulos, e maisRespostas:
Você também pode achar útil a impressão .
fonte
pprint.pprint(a.__dict__)
imprime bastante os atributos.pprint
NÃO funciona no Python 2.6.Em seguida, você pode testar qual é o tipo
type()
ou se é um métodocallable()
.fonte
boston
conjunto de dados do sklearn -__dict__
estava vazio, quando na verdade havia 5 atributos disponíveisvars(obj)
retorna os atributos de um objeto.fonte
Todas as respostas anteriores estão corretas, você tem três opções para o que está perguntando
dir()
vars()
__dict__
fonte
vars(foo)
retornafoo.__dict__
Obviamente, isso imprimirá quaisquer métodos ou atributos na definição de classe. Você pode excluir métodos "particulares" alterando
i.startwith('__')
parai.startwith('_')
fonte
O módulo de inspeção fornece maneiras fáceis de inspecionar um objeto:
Usando
getmembers()
você pode ver todos os atributos da sua classe, juntamente com o valor deles. Para excluir atributos privados ou protegidos, use.startswith('_')
. Para excluir métodos ou funções, useinspect.ismethod()
ouinspect.isfunction()
.Observe que
ismethod()
é usado no segundo elemento de,i
pois o primeiro é simplesmente uma string (seu nome).Offtopic: Use CamelCase para nomes de classes.
fonte
Você pode usar
dir(your_object)
para obter os atributos egetattr(your_object, your_object_attr)
obter os valoresuso:
Isso é particularmente útil se o seu objeto não tiver __dict__. Se não for esse o caso, você pode tentar var (your_object) também
fonte
É frequentemente mencionado que para listar uma lista completa de atributos que você deve usar
dir()
. Observe, porém, que, ao contrário da crença populardir()
, não traz todos os atributos. Por exemplo, você pode perceber que__name__
pode estar faltando nadir()
listagem de uma classe, mesmo que você possa acessá-la na própria classe. No documentodir()
( Python 2 , Python 3 ):Uma função como a seguinte tende a ser mais completa, embora não haja garantia de completude, pois a lista retornada por
dir()
pode ser afetada por muitos fatores, incluindo a implementação do__dir__()
método ou a personalização__getattr__()
ou__getattribute__()
na classe ou em um de seus pais. Consulte os links fornecidos para obter mais detalhes.fonte
O que você quer isso? Pode ser difícil obter a melhor resposta sem conhecer sua intenção exata.
É quase sempre melhor fazer isso manualmente, se você deseja exibir uma instância da sua classe de uma maneira específica. Isso incluirá exatamente o que você deseja e não o que não deseja, e o pedido será previsível.
Se você estiver procurando uma maneira de exibir o conteúdo de uma classe, formate manualmente os atributos de seu interesse e forneça-o como método
__str__
ou__repr__
para sua classe.Se você quiser aprender sobre quais métodos e esses existem para um objeto entender como ele funciona, use
help
.help(a)
mostrará uma saída formatada sobre a classe do objeto com base em suas doutrinas.dir
existe para obter programaticamente todos os atributos de um objeto. (Acessar__dict__
faz algo que eu agruparia da mesma forma, mas que não usaria a mim mesmo.) No entanto, isso pode não incluir o que você deseja e pode incluir o que não deseja. Não é confiável e as pessoas pensam que querem isso com muito mais frequência do que desejam.Em uma nota um tanto ortogonal, há muito pouco suporte para o Python 3 no momento atual. Se você estiver interessado em escrever um software real, precisará de coisas de terceiros, como numpy, lxml, Twisted, PIL ou qualquer número de estruturas da web que ainda não suportem o Python 3 e que não tenham planos para isso tão cedo. As diferenças entre a ramificação 2.6 e 3.x são pequenas, mas a diferença no suporte à biblioteca é enorme.
fonte
Há mais de uma maneira de fazer isso:
Quando executado, esse código produz:
fonte
Por favor, veja o script shell python que foi executado em sequência; aqui você obterá os atributos de uma classe no formato string separados por vírgula.
Eu estou usando python 3.4
fonte
a.__dict__.keys()
. No entanto, se você quiser saber se um objeto tem um atributo específico, você pode usarhasattr
.Além dessas respostas, incluirei uma função (python 3) para espalhar virtualmente toda a estrutura de qualquer valor. Ele usa
dir
para estabelecer a lista completa de nomes de propriedades e depois usagetattr
com cada nome. Ele exibe o tipo de cada membro do valor e, quando possível, também exibe o membro inteiro:Agora, qualquer um dos seguintes deve fornecer informações:
fonte
Obter atributos de um objeto
Resultado
fonte
Conforme escrito antes de usar,
obj.__dict__
pode lidar com casos comuns, mas algumas classes não têm o__dict__
atributo e o uso__slots__
(principalmente para eficiência de memória).exemplo para uma maneira mais resiliente de fazer isso:
saída deste código:
Nota1:
Python é uma linguagem dinâmica e é sempre melhor conhecer as classes das quais você está tentando obter os atributos, pois mesmo esse código pode perder alguns casos.
Nota2:
esse código gera apenas variáveis de instância, o que significa que variáveis de classe não são fornecidas. por exemplo:
saídas de código:
Este código não imprime o
url
atributo de classe e pode omitir os atributos de classe desejados.Às vezes, podemos pensar que um atributo é um membro da instância, mas não é e não será mostrado usando este exemplo.
fonte
__dict__
e__slots__
, portanto, você provavelmente quer tentar as duas, e não apenas o ditado.__dict__
ouvars
não funciona porque perde__slots__
.__dict__
e__slots__
não funciona porque perde as__slots__
classes base.dir
não funciona porque inclui atributos de classe, como métodos ou propriedades, além dos atributos do objeto.vars
é equivalente a usar__dict__
.Este é o melhor que tenho:
fonte
fonte
Por favor, veja a seguinte execução de script de shell do Python em sequência; ela fornecerá a solução desde a criação da classe até a extração dos nomes de campo das instâncias.
fonte
__attr__
fornece a lista de atributos de uma instância.fonte
__attr__
na descrição, mas usa__attrs__
no código. Nem funcionou para mim (werkzeug.datastructures.FileStorage)