使用函数定义的属性而不调用函数

未知的风暴

我是 Python OOP 的新手,下面的程序有问题。当我运行它时,它给了我一个错误AttributeError: 'MyClass' object has no attribute 'sum'通过替换sum = self.sum每个函数中的行compute_sqrtSum()compute_SumSquare()compute_SumCube()通过sum = self.compute_Sum(). 但如果是这样,程序每次运行这三个函数时,都要运行compute_Sum()一次,一共运行三遍。那么有没有一种方法可以访问sum但只能运行compute_Sum()一次?

class MyClass:
    def __init__(self, x, y):
        self.x = x 
        self.y = y 

    def compute_Sum(self):
        sum      = self.x + self.y 
        self.sum = sum         
    
        return sum  

    def compute_sqrtSum(self):
        sum      = self.sum 
        sqrt_sum = sqrt(sum)

        return sqrt_sum 

    def compute_SumSquare(self):
        sum    = self.sum 
        sum_sq = sum * sum 

        return sum_sq 

    def compute_SumCube(self):
        sum    = self.sum 
        sum_cb = sum * sum * sum 

        return sum_cb   

user = MyClass(1, 2)
print(user.compute_sqrtSum())
print(user.compute_SumSquare())
print(user.compute_sqrtCube())
马蒂诺

要即时计算属性,您可以使用属性来自动调用方法来确定需要时的值。但是,如果该类的用户或类本身经常访问该值(如果其中的其他方法也引用它),这可能会变得非常慢。

避免这种情况的一种方法是使属性“惰性”,这意味着在第一次引用它们之前不会计算它们,但是该值会被缓存,因此如果再次需要它,则返回缓存值而不是重新计算.

在下面的代码中,每个方法只会运行一次,因为lazy_property具有创建一个与类的属性同名的实例属性的副作用,这会阻止它再次被调用,因为实例属性的方式是在 Python 中查找。

与@furas' answer相似但不相同它消除了许多重复的代码,并且还可以轻松地将缓存应用于其他属性,因此它们也不会被计算多次。

Python 中的延迟评估属性模式2013 年 6 月 30 日。stevenloria.comCC-BY 4.0许可下获得许可

def lazy_property(fn):
    """Decorator that makes a property lazy-evaluated."""
    attr_name = '_lazy_' + fn.__name__

    @property
    def _lazy_property(self):
        if not hasattr(self, attr_name):
            setattr(self, attr_name, fn(self))  # Create instance attribute.
        return getattr(self, attr_name)

    return _lazy_property


class MyClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    @lazy_property
    def sum(self):
        return self.x + self.y

    @lazy_property
    def sqrtSum(self):
        return sqrt(self.sum)

    @lazy_property
    def SumSquare(self):
        return self.sum * self.sum

    @lazy_property
    def SumCube(self):
        return self.sum * self.sum * self.sum

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章