Python用列表装饰属性setter

dre*_*erD 6 python setter properties list decorator

globalList = []
class MyList:
    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

mL1 = MyList()
print("myList: ", mL1.myList)
mL1.myList.append(4)
print("after appending a 4, myList: ", mL1.myList)
mL1.myList.extend([5,6,"eight","IX"])
print("after extend, myList: ", mL1.myList)
Run Code Online (Sandbox Code Playgroud)

结果:

myList:  [1, 2, 3]
after appending a 4, myList:  [1, 2, 3]
after extend, myList:  [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我面临的问题是mL1.myList.append(4)和mL1.myList.extend([5,6,"8","IX"])不修改mL1对象中的_myList属性.我该怎么做才能解决问题?

kir*_*off 8

我为类对象定义了一个方法append()和一个方法extend().它分别附加到成员myList并扩展成员myList.

global globalList  
globalList = []
class MyList():
    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

    def append(self, val):
        self.myList = self.myList + [val]
        return self.myList  

    def extend(self, val):
        return self.myList.extend(val)


mL1 = MyList()
print("myList: ", mL1.myList)
mL1.append(4)
print("after appending a 4, myList: ", mL1.myList)
mL1.myList.extend([5,6,"eight","IX"])
print("after extend, myList: ", mL1.myList)
Run Code Online (Sandbox Code Playgroud)

结果是

>>> 
('myList: ', [1, 2, 3])
('after appending a 4, myList: ', [1, 2, 3, 4])
('after extend, myList: ', [1, 2, 3, 4, 5, 6, 'eight', 'IX'])
Run Code Online (Sandbox Code Playgroud)

  • 该代码已被严重破坏:) MyList不是从object派生的,它破坏了setter属性,因此在分配给myList之后,它将是一个普通列表。解决此问题后,append()将为每个调用将globalList添加到_mylist中。这个扩展实现也被破坏了,它应该扩展_myList,否则它只会扩展该属性返回的临时列表。最后,该示例调用mL1.myList.extend而不是mL1.extend。 (2认同)