Как динамически изменить свойство? - PullRequest
1 голос
/ 08 ноября 2010

Моя проблема довольно проста, у меня есть строка, содержащая путь к свойству, и я хочу изменить это свойство с помощью строки.трогательно exec()?

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Вы можете использовать setattr:

setattr(someClass, property, data)

Обратите внимание, что это по-прежнему опасно, если это делается без какой-либо проверки пользователя, поскольку ваш пользователь может изменить определение существующих атрибутов, которые он не должен изменять.

Более безопасной альтернативой является использование dict в качестве хранилища значений ключей и помещение туда пользовательских свойств.

0 голосов
/ 08 ноября 2010

Прежде всего, вы хотите установить свойство для класса или экземпляра? В общем, лучший подход - использовать реестр для регистрации объектов (классов или экземпляров), которые вы хотите изменить. Это может быть простой словарь:

registry = {}

Затем явно зарегистрируйте те объекты, которые вы хотите изменить пользователем, например,

class Foo(object):
  pass

f1 = Foo()
f2 = Foo()

registry['Foo'] = Foo
registry['f1'] = f1
registry['f2'] = f2

Для классов в целом вы можете инкапсулировать это немного больше, используя <<class>>.__name__. Поиск прост и легко завершится для всего, что не должно быть изменено:

objectname, propertyname = str.split('.', 1)
o = registry[objectname]

Наконец, установить свойство можно с помощью setattr:

setattr(o, propertyname, data)

или чуть больше OO-иша путем определения явного поведения настройки, которое может фактически проверять свойства, например

class Settable(object):
  allowed = ('foo', 'bar')

  def set(self, prop, val):
    if prop not in self.allowed:
        raise KeyError, prop
    setattr(self, prop, val)

и производные от этого класса вместо:

class Foo(Settable):
    allowed = Settable.allowed + ('blah',)


registry[objectname].set(propertyname, data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...