Як ви програмно встановите атрибут?


204

Припустимо , у мене є об'єкт пітона xі рядок s, як встановити атрибут sна x? Так:

>>> x = SomeObject()
>>> attr = 'myAttr'
>>> # magic goes here
>>> x.myAttr
'magic'

У чому магія? Мета цього, до речі, - кешувати дзвінки x.__getattr__().

Відповіді:


288
setattr(x, attr, 'magic')

Для отримання допомоги:

>>> help(setattr)
Help on built-in function setattr in module __builtin__:

setattr(...)
    setattr(object, name, value)

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ``x.y = v''.

Редагувати: Однак ви повинні зазначити (як зазначено в коментарі), що ви не можете зробити це для "чистого" екземпляра object. Але ймовірно, у вас є простий підклас об'єкта, де він буде добре працювати. Я настійно закликаю ОП ніколи не робити подібних предметів.


12
Однак уважно, це не працює у вашому сценарії, коли ви створюєте екземпляр об’єкта ().
С.Лотт

3
Абсолютно правильно, це не так. Я зручно це ігнорував. Я настійно закликаю ОП ніколи не робити подібних предметів.
Алі Афшар

2
Чорт сором, що це працює не у всіх випадках, оскільки це було б дуже корисно, наприклад, для додавання dirtyатрибуту до вводу користувача ...
вчера

1
@Brice: setattr працює майже у всіх випадках. З метою ефективності та інших причин «об’єкт» запрограмований так, що ви не можете додавати до нього зайві атрибути. Ви можете зробити це у власному класі з __slots__атрибутом.
dirkjot

4
Це також не працює int. Чи можете ви пояснити, чому? (це на всіх__builtin__ ?
Єнс Тіммерман

53

Зазвичай ми визначаємо для цього класи.

class XClass( object ):
   def __init__( self ):
       self.myAttr= None

x= XClass()
x.myAttr= 'magic'
x.myAttr

Тим НЕ менше, ви можете, до деякої міри, зробити це з setattrі getattrвбудованими функціями. Однак вони не працюють objectбезпосередньо на екземплярах .

>>> a= object()
>>> setattr( a, 'hi', 'mom' )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hi'

Однак вони працюють на всіляких простих заняттях.

class YClass( object ):
    pass

y= YClass()
setattr( y, 'myAttr', 'magic' )
y.myAttr

25
Будь-яке розуміння того, чому це не працює з екземплярами object ()?
meawoppl

@meawoppl Вам слід задати це питання
Tobias Kienzler

Запитали тут .
jalanb

1
чи можу я це зробити за допомогою модулів замість класів?
bonobo

21

нехай x - об’єкт, тоді ви можете це зробити двома способами

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