Odpowiedzi:
Istnieją wbudowane funkcje o nazwie getattr
isetattr
getattr(object, attrname)
setattr(object, attrname, value)
W tym przypadku
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1
i zmienną, x = 'df1'
tj. df1 jako łańcuch w var x. chcę wydrukować kształt df w ten sposób getattr(x, 'shape')
lub getattr('df1', 'shape')
. Wiem, że nie można tego zrobić za pomocą getattr ani żadnych innych metod.
new
modułu, który był przestarzały w 2008 roku .Istnieją wbudowane funkcje Pythona setattr i getattr. Które mogą służyć do ustawiania i pobierania atrybutu klasy.
Krótki przykład:
>>> 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
Jeśli chcesz zachować logikę ukrytą w klasie, możesz preferować użycie uogólnionej metody pobierającej, takiej jak ta:
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)))
Wyjścia:
Attribute value of attr1 is 1
Innym rozwiązaniem, które mogłoby to jeszcze lepiej ukryć, byłoby użycie metody magicznej __getattribute__
, ale ciągle otrzymywałem nieskończoną pętlę, której nie mogłem rozwiązać, próbując pobrać wartość atrybutu w tej metodzie.
Pamiętaj również, że możesz alternatywnie użyć vars()
. W powyższym przykładzie możesz wymienić za getattr(self,varname)
pomocą return vars(self)[varname]
, ale getattr
może być preferowane zgodnie z odpowiedzią na pytanie Jaka jest różnica między vars
i setattr
? .