Skip to main content
 首页 » 编程设计

python之链接到其他对象的属性 : how to maintain consistency

2025年05月04日9me-sa

我的类经常有一些属性,而其他对象的属性依赖于这些属性。定义和访问它们的最佳方式是什么? 一个最小的例子应该可以解释我的问题。

假设我有一个定义圆的类:

class Circle: 
    def __init__(self, r): 
        self.r = r 

现在这个圆是根据半径实例化的,但我可能希望能够访问它的直径,这些是我看到的可能性:

A) 在实例化时创建一个新的属性

class Circle: 
    def __init__(self, r): 
        self.r = r 
        self.d = 2*r 

B) 定义一个返回直径的函数

class Circle: 
    def __init__(self, r): 
        self.r = r 
    def d(self): 
        d = 2*r 
        return d 

方案A不保证一致性,如果用户改变了r,d不会自动更新,错误很难追查。解决方案 B 要求用户调用函数而不是访问属性。并且每次访问属性d,都需要重新计算,一般来说可能比较耗时。

有没有方案C既保证一致性又不需要类用户每次访问都重新计算属性?

请您参考如下方法:

您可以在此处使用 Python 属性。

这是文档中对内置属性函数的讨论:

http://docs.python.org/2/library/functions.html#property

在您的情况下,您可以按如下方式使用它:

def getdiameter(self): 
    return self.r * 2 
 
def setdiameter(self, d): 
    self.r = d / 2 
 
d = property(getdiameter, setdiameter) 

您可能希望 d 是只读的(它纯粹是半径的函数)。在这种情况下,您可以省略属性中的 setdiameter 函数。

更新 如果 d 的计算成本非常高,那么我会在第一次读取 d 时计算 d,并在计算 r 时使 d 无效。

def setr(self, r): 
    self.r = r 
    self.d = None 
 
def getd(self): 
    if not self.d is None: 
        return self.d 
    self.d = self.r * 2 # Our expensive calculation 
    return self.d