如何解决Python加法指针
我有2个整数类变量和一个第三类变量,该变量应始终等于添加的2个类变量。有没有一种方法可以创建始终等于var1 + var2
的指针,或者有更好的方法呢?
代码示例:
class Example:
def __init__(self):
self.var1 = 0
self.var2 = 0
self.added_vars = self.var1 + self.var2 # This doesn't stay equal to the vars added when the vars change
def increment(self):
self.var1 += 1
self.var2 += 1
def __repr__(self):
return str(self.added_vars)
ex = Example()
print(ex)
ex.increment()
print(ex)
应打印:
0
2
但是我得到:
0
0
解决方法
将added_vars
定义为属性。这样,您可以像访问任何属性一样访问它,但是每次访问它时都可以动态地重新计算它。您可以在this question中找到有关此信息的更多信息。
class Example:
def __init__(self):
self.var1 = 0
self.var2 = 0
def increment(self):
self.var1 += 1
self.var2 += 1
@property
def added_vars(self):
return self.var1 + self.var2
def __repr__(self):
return str(self.added_vars)
e = Example()
print(e.var1,e.var2,e.added_vars)
# 0 0 0
e.increment()
print(e.var1,e.added_vars)
# 1 1 2
,
答案将很大程度上取决于执行计算的成本以及每次更新输入时进行比较的次数。
如果计算便宜,或者您每次更新输入时都恰好调用一次,那么将其实现为属性将很方便,以便在需要时即时进行计算。 (有关实现的详细信息,请参阅Thierry Lathuille的回答。)
但是,如果计算成本很高,并且您可以在不更改输入(此处为var1
和var2
)的情况下重复调用它,则可以选择:
-
要将其添加为显式属性(在
var1
和var2
旁边)并在increment
方法内执行计算。 -
要使用cached property包,然后在
increment
方法内部,强制使缓存无效(即del self.__dict__['added_vars']
),以便下次使用该属性时访问它会被重新计算,否则缓存将被用于重复访问。这样做的好处是,您只需根据需要进行准确的重新计算即可。
请注意,cached-property
在标准库之外,但是如果您不想安装其他软件包,则也可以自己实现缓存。例如:
class Example:
def __init__(self):
self.var1 = 0
self.var2 = 0
def increment(self):
self.var1 += 1
self.var2 += 1
try:
del self._added_vars
except AttributeError:
pass
@property
def added_vars(self):
try:
return self._added_vars
except AttributeError:
print("recalculating")
self._added_vars = self.var1 + self.var2
return self._added_vars
def __repr__(self):
return str(self.added_vars)
ex = Example()
print(ex)
ex.increment()
print(ex)
print(ex)
礼物:
recalculating
0
recalculating
2
2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。