Odpowiedzi:
Istnieją wbudowane funkcje o nazwie getattrisetattr
getattr(object, attrname)
setattr(object, attrname, value)
W tym przypadku
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1i 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.
newmoduł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 getattrmoże być preferowane zgodnie z odpowiedzią na pytanie Jaka jest różnica między varsi setattr? .