Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表对象的Python属性设置器装饰_Python_List_Decorator_Setter - Fatal编程技术网

列表对象的Python属性设置器装饰

列表对象的Python属性设置器装饰,python,list,decorator,setter,Python,List,Decorator,Setter,我的目标是能够调用mL1.myList,它计算myList实例属性和全局对象globalList,但错误如下: globalList = [] class MyList: def __init__(self): self.myList = [1, 2, 3] @property def myList(self): return self.myList.extend(globalList) @myList.setter de

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

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)
回溯(最近一次呼叫最后一次):
文件“C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py”,第14行,在
mL1=MyList()
文件“C:\Documents and Settings\Administrator\Desktop\Dropbox\sandbox.py”,第6行,在\uuu init中__
self.myList=[1,2,3]
TypeError:myList()接受1个位置参数,但给出了2个

如何解决此问题?

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

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

其次,属性设置程序需要为要将属性设置为的值接受一个参数,并且需要将基础属性设置为该值

最后,您返回的是
extend
的结果,但是
extend
修改列表并返回None,因此您的代码将导致
None
作为
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

如果您使用的是Python3,那么您可以只执行
类MyList:
而不是
类MyList(object):

我不确定您想做什么,但您似乎误用了属性。属性setter(您使用
myList.setter
创建的内容)是在执行
mL1.myList=something
时调用的内容。它需要接受另一个参数,即属性要设置的值
something
。如果你想要的只是能够阅读
mL1.myList
,那你为什么需要一个setter呢?你想让二传手做什么?澄清我的一些误解!非常感谢。
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