Jak uzyskać dostęp do atrybutu obiektu podanego łańcucha odpowiadającego nazwie tego atrybutu

153

Jak ustawić / uzyskać wartości atrybutów tpodanych przez x?

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

t = Test()
x = "attr1"
Nullpoet
źródło

Odpowiedzi:

284

Istnieją wbudowane funkcje o nazwie getattrisetattr

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

W tym przypadku

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
źródło
12
Istnieje również funkcja delattr do usuwania atrybutów, ale jest to rzadko używane.
Dave Kirby,
11
i hasattr do testowania, czy obiekt ma określony atrybut, chociaż w tym przypadku użycie trzyargumentowej postaci getattr (obiekt, nazwa atrybutu, domyślne) jest często lepsze.
Duncan,
czy jest tak, że możemy użyć getattr w ten sposób i powiedzieć, że mam ramkę danych 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.
ihightower
3

Uwaga: ta odpowiedź jest bardzo nieaktualna. Dotyczy to Pythona 2 przy użyciu 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
aatifh
źródło
0

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? .

not2savvy
źródło