gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:44 25 4
gpt4 key购买 nike

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

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

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

关于python - 链接到其他对象的属性 : how to maintain consistency?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com