Ответ 1
setattr(my_class_instance, 'attr_name', attr_value)
Скажем, я создаю экземпляр класса и хочу присвоить некоторые значения его общедоступным свойствам. Обычно это делается следующим образом:
class MyClass:
def __init__(self):
self.name = None
self.text = None
myclass = MyClass()
myclass.name = 'My name'
Но что, если написать функцию, которая принимает класс как параметр, и я хотел бы присвоить некоторые значения общедоступным свойствам этого класса динамически - то есть через переменные и циклы (не зная, сколько их есть или что они называются.)
Очевидным будет:
myclass = MyClass()
myclass['name'] = "My name"
Но это не работает.
Любые идеи?
setattr(my_class_instance, 'attr_name', attr_value)
После чтения отклонено Синтаксис для доступа к динамическим атрибутам Я использую класс mixin, предоставляющий доступ к атрибутам объекта в стиле словаря:
class MyClass:
def __init__(self):
self.name = None
self.text = None
def __getitem__(self, name):
return getattr(self, name)
def __setitem__(self, name, value):
return setattr(self, name, value)
def __delitem__(self, name):
return delattr(self, name)
def __contains__(self, name):
return hasattr(self, name)
Пока можно настроить атрибуты напрямую:
myclass = MyClass()
myclass.name = "foo"
myclass.text = "bar"
тогда можно установить их динамически:
for attr in ('name', 'text'):
myclass[attr] = confirm(attr, default=myclass[attr])
Использование dir
с setattr
должно выполнять задание
class MyClass:
def __init__(self):
self.name = None
self.text = None
myclass = MyClass()
myclass.name = 'My name'
for prop in dir(myclass):
print '%s:%s'%(prop,getattr(myclass,prop))
print
for prop in dir(myclass):
if prop[:2]!='__' and prop[-2:]!='__':
print prop[-2:]
setattr(myclass,prop,"Foo Bar")
for prop in dir(myclass):
print '%s:%s'%(prop,getattr(myclass,prop))
Но будьте осторожны, потому что этот код также устанавливает свойства '__doc__', '__init__', '__module__'
в "Foo Bar". Поэтому вам придется позаботиться о том, чтобы избежать определенных вещей, предоставленных вам dir
(особенно те, которые начинаются и заканчиваются с __
двойными подчеркиваниями).