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
我该怎么做才能解决这个问题?
答案 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:
。