Как программно установить атрибут?

Предположим, у меня есть объект Python x и строка s, как мне установить атрибут s на x? Так:

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

Что за магия? Цель этого, кстати, состоит в том, чтобы кэшировать вызовы x.__getattr__().

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
228
0
221 861
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
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. Но, скорее всего, у вас есть простой подкласс объекта, с которым он будет работать нормально. Я настоятельно рекомендую ОП никогда не создавать экземпляры таких объектов.

Однако будьте осторожны, это не работает в вашем сценарии, где вы создаете экземпляр object ().

S.Lott 12.11.2008 22:42

Совершенно верно, это не так. Я для удобства проигнорировал это. Я настоятельно рекомендую ОП никогда не создавать экземпляры таких объектов.

Ali Afshar 12.11.2008 22:44

Черт возьми, это работает не во всех случаях, так как это было бы действительно полезно, например, для добавления атрибута dirty к пользовательскому вводу ...

brice 28.02.2012 22:32

@Brice: setattr работает почти во всех случаях. По соображениям эффективности и по другим причинам «объект» запрограммирован так, что вы не можете добавлять к нему дополнительные атрибуты. Вы можете сделать это с вашим собственным классом с атрибутом __slots__.

dirkjot 22.03.2012 02:10

Это также не работает на int. Вы можете объяснить почему? (это на всех __builtin__?

Jens Timmerman 05.09.2012 19:59

@JensTimmerman: Практически, потому что целые числа должны быть неизменными. Реализация стажеры небольших целых чисел, строк и некоторых других встроенных неизменяемых типов. Если бы вам было разрешено устанавливать произвольные атрибуты для этих типов, это интернирование нарушило бы множество тонких и запутанных способов.

Kevin 11.10.2016 02:47

Можно ли создать подкласс int, используя шаблон type(cls, (int,), kwargs)? (Я создаю подклассы float на регулярной основе и заменяю __init__ в настраиваемом поплавке, чтобы добавить настраиваемые атрибуты)

cowbert 13.12.2017 00:35

Обычно для этого мы определяем классы.

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

Любое понимание, почему это не работает с экземплярами object ()?

meawoppl 07.04.2013 21:14

@meawoppl Вы должны спросить это как новый вопрос

Tobias Kienzler 30.04.2015 13:43

могу я сделать это с модулями вместо классов?

bonobo 26.06.2018 17:12

Ссылка в комментарии @ jalanb - 404.

Reid 24.11.2020 19:47

пусть x будет объектом, тогда вы можете сделать это двумя способами

x.attr_name = s 
setattr(x, 'attr_name', s)

Также отлично работает в классе:

def update_property(self, property, value):
   setattr(self, property, value)

Другие вопросы по теме