Existe um método embutido no Python para obter um array de todas as variáveis de instância de uma classe? Por exemplo, se eu tiver este código:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
Existe uma maneira de fazer isso:
>>> mystery_method(hi)
["ii", "kk"]
Edit: Eu originalmente pedi variáveis de classe erroneamente.
python
methods
instance-variables
Chris Bunch
fonte
fonte
Respostas:
Cada objeto possui uma
__dict__
variável contendo todas as variáveis e seus valores.Tente isto
fonte
Use vars ()
fonte
__method
é privado,__method__
é um método especial, não necessariamente privado; Eu gostaria de dizer que os métodos especiais definem as capacidades de um objeto em vez de métodos.__method__
é muito feio, e acho que eles foram nomeados dessa forma para tentar impedir as pessoas de usá-los, a menos que seja absolutamente necessário. Neste caso, temos a alternativa vars ().__str__
,__method__
normalmente são para o próprio idioma. O que acontece quando vocêstr(something)
?Você normalmente não pode obter atributos de instância dados apenas uma classe, pelo menos não sem instanciar a classe. Você pode obter atributos de instância dada uma instância, entretanto, ou atributos de classe dada uma classe. Veja o módulo 'inspecionar'. Você não pode obter uma lista de atributos de instância porque as instâncias realmente podem ter qualquer coisa como atributo e - como em seu exemplo - a maneira normal de criá-los é apenas atribuí-los no método __init__.
Uma exceção é se sua classe usa slots, que é uma lista fixa de atributos que a classe permite que as instâncias tenham. Os slots são explicados em http://www.python.org/2.2.3/descrintro.html , mas existem várias armadilhas com os slots; eles afetam o layout da memória, portanto, a herança múltipla pode ser problemática e, em geral, a herança também deve levar os slots em consideração.
fonte
Os métodos Vars () e dict funcionarão para o exemplo postado pelo OP, mas não para objetos definidos "vagamente" como:
Para imprimir todos os atributos não chamáveis, você pode usar a seguinte função:
fonte
exec('print object.%s\n\n') % i
deve ser escrito comoprint getattr(object, i)
Você também pode testar se um objeto tem uma variável específica com:
fonte
Seu exemplo mostra "variáveis de instância", não realmente variáveis de classe.
Procure
hi_obj.__class__.__dict__.items()
as variáveis de classe, junto com outros membros da classe, como funções de membro e o módulo que o contém.Variáveis de classe são compartilhadas por todas as instâncias da classe.
fonte
Sugira
Em outras palavras, basicamente envolve __dict__
fonte
Embora não seja uma resposta direta à pergunta do OP, há uma maneira muito agradável de descobrir quais variáveis estão no escopo de uma função. dê uma olhada neste código:
O atributo func_code contém todos os tipos de coisas interessantes. Ele permite que você faça algumas coisas legais. Aqui está um exemplo de como tenho usado isso:
fonte
construído com base na resposta da dmark para obter o seguinte, o que é útil se você deseja o equivalente a sprintf e espero que ajude alguém ...
fonte
Às vezes, você deseja filtrar a lista com base em vars públicos / privados. Por exemplo
fonte