链接到其他人的对象属性:如何保持一致性?

时间:2013-10-24 23:06:52

标签: python

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

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

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时,都必须重新计算属性d,一般来说这可能很耗时。

是否有解决方案C可确保一致性,并且每次访问时都不需要类用户重新计算属性?

1 个答案:

答案 0 :(得分:1)

你可以在这里使用Python属性。

以下是docs中内置属性函数的讨论:

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,并在计算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