Como acessar o atributo do objeto, dada a sequência correspondente ao nome desse atributo

153

Como você define / obtém os valores dos atributos tdados por x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"
Nullpoet
fonte

Respostas:

284

Existem funções internas chamadas getattresetattr

getattr(object, attrname)
setattr(object, attrname, value)

Nesse caso

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
fonte
12
Também há delattr para excluir atributos, mas isso raramente é usado.
Dave Kirby
11
e hasattr para testar se um objeto tem ou não um atributo específico; nesse caso, usar o formulário de três argumentos getattr (objeto, nome do atributo, padrão) geralmente é melhor.
Duncan
existe de qualquer maneira, podemos usar getattr como este e dizer que eu tenho um quadro de dados df1e uma variável x = 'df1'ou seja, df1 como uma string em var x. Eu quero imprimir a forma de df como este, getattr(x, 'shape')ou getattr('df1', 'shape'). Eu sei que isso não pode ser feito com getattr, quaisquer outros métodos.
ihightower
3

Nota: Esta resposta está muito desatualizada. Isso se aplica ao Python 2 usando o newmódulo que foi descontinuado em 2008 .

Há python construído nas funções setattr e getattr. Que pode ser usado para definir e obter o atributo de uma classe.

Um breve exemplo:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20
aatifh
fonte
0

Se você deseja manter a lógica oculta dentro da classe, pode preferir usar um método getter generalizado da seguinte forma:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

Saídas:

Attribute value of attr1 is 1

Outra abordagem que poderia escondê-lo ainda melhor seria usar o método mágico __getattribute__, mas eu continuava obtendo um loop infinito que não conseguia resolver ao tentar recuperar o valor do atributo dentro desse método.

Observe também que você pode usar como alternativa vars(). No exemplo acima, você poderia trocar getattr(self,varname)por return vars(self)[varname], mas getattrpode ser preferível de acordo com a resposta para Qual é a diferença entre varse setattr? .

not2savvy
fonte