【发布时间】:2021-05-02 00:17:16
【问题描述】:
假设我有以下课程:
import math
class LineSegment:
def __init__(
self,
origin,
termination,
):
self.origin = origin
self.termination = termination
self.length = self.calculate_length()
def calculate_length(self):
return math.sqrt(
(self.origin.x - self.termination.x) ** 2
+ (self.origin.y - self.termination.y) ** 2
)
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
LineSegment 类的一个对象由 Point 类的两个对象组成。现在,假设我这样初始化一个对象:
this_origin = Point(x=0, y=0)
this_termination = Point(x=1, y=1)
this_line_segment = LineSegment(origin=this_origin, termination=this_termination)
注意:线段的初始化会自动计算其长度。这对代码库的其他部分至关重要,并且无法更改。我可以看到它的长度是这样的:
print(this_line_segment.length) # This prints "1.4142135623730951" to the console.
现在,我需要改变 this_line_segment 的子对象的一个参数:
this_line_segment.origin.x = 1
但是,this_line_segments 长度属性不会根据新原点的 x 坐标进行更新:
print(this_line_segment.length) # This still prints "1.4142135623730951" to the console.
当类所依赖的属性之一发生变化时,实现更新类属性的pythonic方法是什么?
【问题讨论】:
-
将
length定义为属性并在读取访问时更新/计算它。请参阅示例here,该示例验证写入数据。类似,但您将计算代码放在属性 getter 而不是 setter 上。
标签: python class object parameters attributes