lis上的Python属性

2024-05-09 23:23:24 发布

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

我是Python新手,我刚刚发现了这些属性。当我在一个简单的变量上尝试时,它工作得很好,但是我不能让它在列表上工作。当执行下面的代码时,它将调用两次getter而不是setter。我知道在我的示例中,属性没有附加值,但它是为了简化。

class C:
    def __init__(self):
        self._x = [1, 2, 3]

    @property
    def x(self):
        print("getter")
        return self._x
    @x.setter
    def x(self, value):
        print("setter")
        self._x = value

c = C()
c.x[1] = 4
print(c.x[1])

有人知道我做错了什么吗?


Tags: 代码self示例列表属性initvaluedef
2条回答

实际上,您的c.x[1] = 4分为两个操作:

  1. 获取c的“x”属性(=>;getter)
  2. 在结果对象上设置项。

要想摆脱这一切是不容易的。但不管怎样,它最终还是达到了你想要的,不是吗?

如果你写了如下内容,setter就会被调用:

c.x = another_list

只有直接获取或设置属性时,才使用setter/getter:

c.x           # getter
c.x = [1,2,3] # setter

如果修改属性中的元素,则获取该属性,然后设置相应的元素。你的例子相当于

d = c.x       # getter again
d[1] = 4

您还可以使用__getitem____setitem__直接允许设置和获取特定项。

class C:
    def __init__(self):
        self._x = [1, 2, 3]

    @property
    def x(self):
        print("getter")
        return self._x
    @x.setter
    def x(self, value):
        print("setter")
        self._x = value

    def __getitem__(self, idx):
        print("getitem")
        return self._x[idx]

    def __setitem__(self, idx, value):
        print("setitem")
        self._x[idx] = value

>>> c = C()
>>> c[1] = 3
setitem
>>> c.x
getter
[1, 3, 3]
>>> c[2]
getitem
3

相关问题 更多 >