假设我创建了一个类的实例,并希望为其公共属性分配一些值。通常,这将是这样做的:
class MyClass:
def __init__(self):
self.name = None
self.text = None
myclass = MyClass()
myclass.name = 'My name'
但是,如果编写一个将类作为参数的函数,并且我想动态地为该类的公共属性分配一些值 - 即通过变量和循环(不知道它们有多少或它们是什么),该怎么办?被称为。)
显而易见的是:
myclass = MyClass()
myclass['name'] = "My name"
但这不起作用。
有什么想法吗?
答案 0 :(得分:37)
setattr(my_class_instance, 'attr_name', attr_value)
答案 1 :(得分:8)
阅读被拒绝后Syntax For Dynamic Attribute Access我正在使用一个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])
答案 2 :(得分:0)
将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
(特别是那些以__
双下划线开头和结尾的内容)给您的某些内容。