0
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)

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

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

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

4

1 回答 1

0

你的代码有很多问题。可能最大的一个问题是您不能为您的属性赋予与它读取的基础属性相同的名称。如果在你的myListgetter 中,你这样做self.myList,它将导致无限递归,因为为了找出self.myList它必须再次调用属性 getter 是什么。

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

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

最后,您返回 的结果extend,但extend修改了列表并返回 None,因此您的代码将返回None的值mL1.myList

您的代码应该看起来更像这样:

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

如果您使用的是 Python 3,就像您看起来一样,那么您可以只做class MyList:而不是class MyList(object):.

于 2013-05-04T05:24:48.093 回答