第 9 章 代理模式
# LazyProperty 类实际上是一个描述符
class LazyProperty:
def __init__(self, method):
# method 变量是一个实际方法的别名
# method_name 变量则是该方法名称的别名
self.method = method
self.method_name = method.__name__
# print('function overriden: {}'.format(self.method))
# print("function's name: {}".format(self.method_name))
# LazyProperty 类仅重写了 __get__(),因为这是其需要重写的唯一访问方法。
def __get__(self, obj, cls):
# __get__() 使用值来替代方法,这意味着不仅特性是惰性加载的,而且仅可以设置一次。
if not obj:
return None
value = self.method(obj)
# print('value {}'.format(value))
setattr(obj, self.method_name, value)
return value
class Test:
def __init__(self):
self.x = 'foo'
self.y = 'bar'
# 我们想懒加载 _resource 变量,因此将其初始化为 None
self._resource = None
@LazyProperty
def resource(self):
print('initializing self._resource which is: {}'.format(self._resource))
self._resource = tuple(range(5)) # 假设这一行的计算成本比较大
return self._resource
def main():
t = Test()
print(t.x)
print(t.y)
# 注意,__get__() 访问方法的重写使得可以将 resource() 方法当作一个变量
print(t.resource)
print(t.resource)
if __name__ == '__main__':
main()9.2 软件的例子
9.3 应用案例
9.4 实现
9.5 小结
Last updated