【问题标题】:Using getter and setter with three attributes使用具有三个属性的 getter 和 setter
【发布时间】:2022-01-11 07:43:27
【问题描述】:

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

我的目标是根据ab 更新c,据我所知,所有这些属性都应该可以从类外部访问,即公共字段。

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'

【问题讨论】:

  • 请注意,有时您的变量有下划线,有时没有。这不应该在整个代码中保持一致吗?

标签: python python-2.7 properties getter-setter


【解决方案1】:

您的实现存在缺陷。

设置 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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2017-06-27
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多