使用具有三个属性的 getter 和 setter

Using getter and setter with three attributes

请解释一下我对 getter 和 setter 的不理解,当我尝试实例化测试 class 时,这段代码已经捕获了异常? 在我看来,同样有效 here.

我的目标是根据 ab 更新 c,其中所有这些属性都应该可以从 class 外部访问,即 public 字段,据我了解。

class Test:
    def __init__(self, p1=50, p2=20):
        self.a = p1
        self.b = p2
    
    @property
    def a(self):
        return self._a
    @a.setter
    def a(self, val):
        self._a = val
        self._c = self.b - val // 5
    
    @property
    def b(self):
        return self._b
    @b.setter
    def b(self, val):
        self._b = val
    
    @property
    def c(self):
        return self._c  
>>> c = Test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "...\getter_and_setter.py", line 3, in __init__
    self.a = p1
  File "...\getter_and_setter.py", line 12, in a
    self._c = self.b - val // 5
  File "...\getter_and_setter.py", line 16, in b
    return self._b
AttributeError: 'Test' object has no attribute '_b'

您的实施存在缺陷。

设置 a 取决于已经设置的 b。如果您交换 __init__ 中的 2 个赋值语句,它将解决您当前的问题。但是请注意,您的实施存在很大缺陷。如果您更改 b,该更改将不会反映在 c

ab 不需要使用 getter 和 setter。

class Test:
    def __init__(self, p1=50, p2=20):
        self.a = p1
        self.b = p2
    
    
    @property
    def c(self):
        return self.b - self.a // 5