我的类经常有一些属性,其他对象的属性依赖于那些属性。定义和访问这些的最佳方法是什么? 一个最小的例子应该解释我在问什么。
假设我有一个定义圆圈的类:
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可确保一致性,并且每次访问时都不需要类用户重新计算属性?
答案 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