Як отримати доступ до атрибута об'єкта, заданого рядка, відповідного імені цього атрибута


153

Як встановити / отримати значення атрибутів, tзаданих x?

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

t = Test()
x = "attr1"

Відповіді:


284

Є вбудовані функції, що називаються getattrіsetattr

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

В цьому випадку

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
Існує також delattr для видалення атрибутів, але це рідко використовується.
Дейв Кірбі

11
і hasattr для тестування того, чи має об’єкт конкретний attr, хоча в цьому випадку, використовуючи три аргумента форми getattr (об'єкт, attrname, за замовчуванням), часто краще.
Дункан

чи все-таки ми можемо використовувати getattr, як це, і сказати, що у мене є фрейм даних df1та змінна, x = 'df1'тобто df1 як рядок у var x. я хочу надрукувати форму df, як це, getattr(x, 'shape')або getattr('df1', 'shape'). Я знаю, що це не може бути зроблено з getattr, будь-якими іншими методами.
ihightower

3

Примітка. Ця відповідь дуже застаріла. Він застосовується до Python 2 з використанням newмодуля, який був застарілий у 2008 році .

Є пітон, вбудований у функції setattr і getattr. Що можна використовувати для встановлення та отримання атрибута класу.

Короткий приклад:

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

0

Якщо ви хочете зберегти логіку, приховану всередині класу, ви можете скористатися узагальненим методом getter таким чином:

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)))

Виходи:

Attribute value of attr1 is 1

Ще одним підходом, який міг би приховати це ще краще, буде використання магічного методу __getattribute__, але я продовжував отримувати нескінченний цикл, який я не зміг вирішити, намагаючись отримати значення атрибута всередині цього методу.

Також зауважте, що ви можете альтернативно використовувати vars(). У наведеному вище прикладі, ви можете обміняти getattr(self,varname)на return vars(self)[varname], але getattrможе бути кращим в відповідно до відповіддю на В чому різниця між varsі setattr? .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.