我的类经常有一些属性,而其他对象的属性依赖于这些属性。定义和访问它们的最佳方式是什么? 一个最小的例子应该可以解释我的问题。
假设我有一个定义圆的类:
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
