Respostas:
Existem funções internas chamadas getattresetattr
getattr(object, attrname)
setattr(object, attrname, value)
Nesse caso
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
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.
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
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? .