修改setattr以将多个属性大量分配给不同的值

时间:2014-06-17 12:40:49

标签: python

我试图创建一个可以一次为不同的值分配多个属性的类。所以,我试图修改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和最有效的方式来完成这项工作

2 个答案:

答案 0 :(得分:0)

TypeError表示相当不错:名称(第二个参数)必须是字符串,而不是列表。

  

参数是一个对象,一个字符串和一个任意值

https://docs.python.org/2/library/functions.html#setattr

答案 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]