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