Python属性setter装饰列表对象

时间:2013-05-04 05:15:50

标签: python list decorator setter

globalList = []
class MyList:
    def __init__(self):
        self.myList = [1, 2, 3]

    @property
    def myList(self):
        return self.myList.extend(globalList)
    @myList.setter
    def myList(self):
        return self.myList
mL1 = MyList()
print("myList: ", mL1.myList)
mL1.myList.append(4)
print("after appending a 4, myList: ", mL1.myList)

我的目标是能够调用mL1.myList来计算myList实例属性和全局对象globalList,但这里是错误:

Traceback (most recent call last):
  File "C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py", line 14, in <module>
    mL1 = MyList()
  File "C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py", line 6, in __init__
    self.myList = [1, 2, 3]
TypeError: myList() takes 1 positional argument but 2 were given

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。可能最大的一个是,您不能为您的属性提供与其读取的基础属性相同的名称。如果在myList getter中,你执行self.myList,它将导致无限递归,因为为了找出self.myList是什么,它必须再次调用属性getter。

为了避免这种情况,你应该让getter和setter引用一些其他属性,通常是相同的名称,但前面是下划线。也就是说,对于您的情况,使用“隐藏”属性_myList来存储属性获取/设置的值。

其次,属性设置器需要接受您要将属性设置为的值的参数,并且需要将基础属性设置为该值。

最后,您将返回extend的结果,但extend会修改列表并返回None,因此您的代码将None作为{{1}的值}}

您的代码应该更像这样:

mL1.myList

如果你正在使用Python 3,那么你就可以globalList = [] class MyList(object): def __init__(self): self.myList = [1, 2, 3] @property def myList(self): return self._myList + globalList @myList.setter def myList(self, val): self._myList = val 而不是class MyList: