Respostas:
Existem funções internas chamadas getattr
esetattr
getattr(object, attrname)
setattr(object, attrname, value)
Nesse caso
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1
e 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.
new
mó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 getattr
pode ser preferível de acordo com a resposta para Qual é a diferença entre vars
e setattr
? .