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


154

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

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

t = Test()
x = "attr1"

Ответы:


285

Есть встроенные функции, вызываемые getattrиsetattr

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

В таком случае

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

12
Существует также delattr для удаления атрибутов, но он используется редко.
Дейв Кирби

11
и hasattr для проверки того, имеет ли объект конкретный атрибут, хотя в этом случае лучше использовать форму с тремя аргументами getattr (object, attrname, default).
Дункан

есть ли в любом случае, мы можем использовать getattr вот так и сказать, что у меня есть датафрейм df1и переменная, x = 'df1'т.е. df1, как строка в var x. Я хочу напечатать форму DF, как это, getattr(x, 'shape')или getattr('df1', 'shape'). Я знаю, что это не может быть сделано с getattr, любыми другими методами.
ihightower

вы можете сделатьgetattr(globals()[x], 'shape')
afult

3

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

В Python встроены функции 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

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

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.