对 Python class 中的相关属性使用 @属性 装饰器

Using the @property decorator for interrelated attributes within a Python class

这个问题涉及在 Python 中的 class 中使用 @属性 装饰器。我想创建一个带有两个 public 属性(比如 a 和 b)的 class。我还希望 class 有一个进一步的 public 属性(比如 c),它总是等于基于 class 中其他属性的一些计算(比如 a + b = c) .属性 c 需要 publicly getable,但由于对 a 和 b 的依赖,如果可能的话,我真的不希望它 publicly getable。

下面的代码块不会 运行 因为当在第 3 行设置 self.a 时,调用 a.setter 会引发 AttributeError 因为 self.b 在行14 尚未设置。

在这种情况下使用 @属性 装饰器是否正确?

最Python在初始化方法中正确设置属性 a、b 和 c 的方法是什么?理想情况下,如果可能的话,不必在多个地方定义 a、b 和 c 之间的关系(即不同于下面的代码,其中 a、b 和 c 之间的关系在第 13 行和第 22 行定义)?

此外,是否可以强制用户不能直接设置 c 的值,最 Pythonic 的方法是什么?

class ExampleClass1:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, a):
        self._a = a
        self.c = self._a + self.b

    @property
    def b(self):
        return self._b

    @b.setter
    def b(self, b):
        self._b = b
        self.c = self._b + self.a

我认为您的处理方式有误。如果您需要的属性 c 始终是 ab 的总和,那么 that 属性需要 [=26] =]:

@property
def c(self):
    return self.a + self.b

而且您根本不需要 ab 的属性。

这也解决了不可设置的问题;如果不为c定义setter,则无法直接设置。

刚刚出现在你的post。

我遇到了完全相同的问题,我认为这似乎有效:

class ExampleClass1:

    def __init__(self, a, b):
        self.a = a
        self.b = b
        
    @property
    def a(self):
        return self._a
    
    @a.setter
    def a(self, value):
        self._a = value
        try:
            self.c = self._a + self.b
        except AttributeError:
            self.c = self._a
    
    @property
    def b(self):
        return self._b
    
    @b.setter
    def b(self, value):
        self._b = value
        try:
            self.c = self.a + self._b
        except AttributeError:
            self.c = self._b

当我尝试为 'c' 使用一次 属性 装饰器时,它导致每次执行 'a' 和 'b' 的总和您访问属性 'c'.

为了避免这种情况,我们需要按照您的建议使用 setter 方法,但是我们当然会 运行 进入该循环。 try-except 似乎打败了这个。