类方法调用twi

2024-09-30 04:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码。在

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)

Tags: 代码inselfreturninittfdefclass
2条回答

你叫了两次。在结尾的print()中一次,在对m_est_maj的调用中一次。在

数学运算是一个相当便宜的运算。通过缓存结果,您可能不会获得有意义的性能提升。但如果你愿意的话,你可以这么做。您可以从__init__调用m_in_maj,并将结果保存到实例属性中,并引用该属性而不是函数调用。在

或者您可以让函数检查instance属性是否已经定义,在第一次调用时进行计算,然后在后续调用时返回。在

这是我看到的一种非常常见的一般方法:

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):
        if not hasattr( self, '_m_in_maj_result'):
            print('foo')
            self._m_in_maj_result =  \
                2 * (self.bf * self.tf * (self.tf / 2 + self.hw / 2))
        return self._m_in_maj_result


    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())

基于How to know if an object has an attribute in Python,这样做可能更像Python:

^{pr2}$

您的m_in_maj方法在m_est_maj方法中调用:

def m_est_maj(self):
    return self.m_in_maj() / ((self.hw + 2 * self.tf) / 2)

相反,请给它一个可选参数,并仅在未传递此参数时调用m_in_maj

^{pr2}$

然后,在调用m_est_maj时:

x = A.m_in_maj()
print(x, A.m_est_maj(x))

相关问题 更多 >

    热门问题