对 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
始终是 a
和 b
的总和,那么 that 属性需要 [=26] =]:
@property
def c(self):
return self.a + self.b
而且您根本不需要 a
或 b
的属性。
这也解决了不可设置的问题;如果不为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 似乎打败了这个。
这个问题涉及在 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
始终是 a
和 b
的总和,那么 that 属性需要 [=26] =]:
@property
def c(self):
return self.a + self.b
而且您根本不需要 a
或 b
的属性。
这也解决了不可设置的问题;如果不为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 似乎打败了这个。