我有以下代码。在
class DobleTSim():
def __init__(self, bf, hw, tf, tw):
self.bf = bf
self.hw = hw
self.tf = tf
self.tw = tw
def m_in_maj(self):
print('foo')
return 2 * (self.bf * self.tf * (self.tf / 2 + self.hw / 2))
def m_est_maj(self):
return self.m_in_maj() / ((self.hw + 2 * self.tf) / 2)
A = DobleTSim(200, 500, 12, 12)
print(A.m_in_maj(), A.m_est_maj())
当我执行代码时,输出是:
^{pr2}$如何避免两次执行“m_in_maj”方法?在
------编辑---
另一个解决方案是使用属性和lru缓存装饰器。使用这个有缺点吗?。在
import functools
class DobleTSim():
def __init__(self, bf, hw, tf, tw):
self.bf = bf
self.hw = hw
self.tf = tf
self.tw = tw
@property
@functools.lru_cache()
def m_in_maj(self):
print('foo')
self.a = 2 * (self.bf * self.tf * (self.tf / 2 + self.hw / 2))
return self.a
def m_est_maj(self):
return self.m_in_maj / ((self.hw + 2 * self.tf) / 2)
你叫了两次。在结尾的
print()
中一次,在对m_est_maj
的调用中一次。在数学运算是一个相当便宜的运算。通过缓存结果,您可能不会获得有意义的性能提升。但如果你愿意的话,你可以这么做。您可以从
__init__
调用m_in_maj
,并将结果保存到实例属性中,并引用该属性而不是函数调用。在或者您可以让函数检查instance属性是否已经定义,在第一次调用时进行计算,然后在后续调用时返回。在
这是我看到的一种非常常见的一般方法:
基于How to know if an object has an attribute in Python,这样做可能更像Python:
^{pr2}$您的
m_in_maj
方法在m_est_maj
方法中调用:相反,请给它一个可选参数,并仅在未传递此参数时调用
^{pr2}$m_in_maj
:然后,在调用
m_est_maj
时:相关问题 更多 >
编程相关推荐