我试图创建一个可以一次为不同的值分配多个属性的类。所以,我试图修改setattr来做到这一点。
class hello():
def __setattr__(self,attr,value):
if type(attr) == str:
self.__dict__[attr] = value
elif type(attr) == list:
for item,val in zip(attr,value):
self.__dict__[item] = val
else:
print "Error!!!"
这样我想要的课就有了这个属性:
>>> hola = hello()
>>> setattr(hola,["a","b"],[1,2])
>>> hola.a
1
>>> hola.b
2
但这样做会返回
TypeError: attribute name must be string, not 'list'
我确实可以在类中为这个作业定义一个特殊的方法,比如
def assigner(self, attrlist, valuelist):
for item,value in zip(attrlist,valuelist):
self.__dict__[item] = value
但是想知道为什么不可能通过setattr和最有效的方式来完成这项工作
答案 0 :(得分:0)
TypeError
表示相当不错:名称(第二个参数)必须是字符串,而不是列表。
参数是一个对象,一个字符串和一个任意值
答案 1 :(得分:0)
来自docs on the setattr
function:
参数是对象,字符串和任意值。
第二个参数 为str
。
可能的解决方法是定义__setitem__
而不是__setattr__
class hello():
def __setitem__(self, k, v):
self.__dict__.update(zip(k, v) if type(k) is tuple else [(k, v)])
这将允许您以dict
样式
In [2]: heya = hello()
In [3]: heya['a', 'b'] = [1, 2]
In [4]: heya.a
Out[4]: 1
In [5]: heya.b
Out[5]: 2
但是,没有什么能阻止你像这样分配它们
In [15]: heya.a, heya.b = [1, 2]