Вопрос-Ответ

How to access (get or set) object attribute given string corresponding to name of that attribute

Как получить доступ (получить или установить) к заданной строке атрибута объекта, соответствующей имени этого атрибута

Как установить / получить значения атрибутов, t заданныхx?

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

t = Test()
x = "attr1"
Переведено автоматически
Ответ 1

Вызываются встроенные функции getattr и setattr

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

В данном случае

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Ответ 2

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

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

Ответ 3

Примечание: Этот ответ очень устарел. Он применим к Python 2 с использованием new модуля, который устарел в 2008 году.

В функции setattr и getattr на python встроены функции. Которые можно использовать для установки и получения атрибута класса.

Краткий пример:

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