惰性计算(Lazy evaluation) https://blog.csdn.net/qq_53...
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
惰性计算(Lazy evaluation) https://blog.csdn.net/qq_53...
class LazyProperty:
def init(self, fun):
self.fun = fun
class ReadonlyNumber:
def init(self, value):
self.value = value
class Circle:
pi = ReadonlyNumber(3.14)
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