惰性计算(Lazy evaluation)

root
abc abc

惰性计算(Lazy evaluation) https://blog.csdn.net/qq_53...

root
abc abc
  • 7 Jul

class LazyProperty:
def init(self, fun):
self.fun = fun

def __get__(self, instance, owner):
    print("get被调用")
    if instance is None:
        return self
    value = self.fun(instance)
    # 三个参数,第一个预设置的对象,第二个是预设置对象key,第三个是名下的value
    setattr(instance, self.fun.__name__, value)  # 给instance设置个属性{"self.fun__name__": value},self.fun指向的是area那个函数,
    # self.fun__name__的意思就是获取这个函数的名字,所以这句的意思就是给a指向的实例对象是设置一个属性{"area": value}
    return value

# def __set__(self, instance, value):
#     pass

class ReadonlyNumber:
def init(self, value):
self.value = value

def __get__(self, instance, owner):
    return self.value

def __set__(self, instance, value):
    raise AttributeError(f"{self.value} is not modifiable")

class Circle:
pi = ReadonlyNumber(3.14)

def __init__(self, radius):
    self.radius = radius  # 4

@LazyProperty  # 等价于 area = LazyProperty(area),即LazyProperty创建了一个实例对象 = area
def area(self):
    print("计算面积")
    return self.pi * self.radius ** 2

a = Circle(4)
print(a.dict)
print(a.area)
print(a.dict)
print(a.area) # 这里要继续调用的话就直接取值,不用在进行计算了。

运行结果:
{'radius': 4}
get被调用
计算面积
50.24
{'radius': 4, 'area': 50.24}
50.24

进程已结束,退出代码0