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

2024-06-25 23:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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,但错误如下:

^{pr2}$

我该怎么解决这个问题?在


Tags: selfreturninitdefpropertyclasssetterprint
1条回答
网友
1楼 · 发布于 2024-06-25 23:12:05

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

为了避免这种情况,您应该让getter和setter引用其他一些属性,通常是相同的名称,但前面加下划线。也就是说,对于您的情况,使用一个“hidden”属性_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

如果您使用的是python3,那么您可以只执行class MyList:而不是{}。在

相关问题 更多 >