from __future__ import print_function
import functools
class lazy_property(object):
def __init__(self, function):
self.function = function
# print(function) # <function Person.relatives at 0x00000266E3973AF8>
functools.update_wrapper(self, function) # 把被修饰的方法中的魔法方法全部复制
def __get__(self, obj, type_): # 调用一个属性时,触发
# print(obj) # <__main__.Person object at 0x00000250E9AFE748>
# print(self) # <__main__.lazy_property object at 0x000001DDCC6CDF88>
if obj is None:
return self
val = self.function(obj) # 被修饰的relatives方法
# 添加到文档说明
obj.__dict__[self.function.__name__] = val
return val
def lazy_property2(fn):
attr = '_lazy__' + fn.__name__
@property
def _lazy_property(self):
if not hasattr(self, attr):
setattr(self, attr, fn(self))
return getattr(self, attr)
return _lazy_property
class Person(object):
def __init__(self, name, occupation):
self.name = name
self.occupation = occupation
self.call_count2 = 0
@lazy_property # 类似java的懒汉式的创建模式,需要时才创建
def relatives(self):
# 得到所有relatives,让我们假设它花费很多时间。
relatives = "Many relatives."
return relatives
@lazy_property2
def parents(self):
self.call_count2 += 1
return "Father and mother"
def main( ):
"""
>>> Jhon = Person('Jhon', 'Coder')
>>> Jhon.name
'Jhon'
>>> Jhon.occupation
'Coder'
>>> sorted(Jhon.__dict__.items()) # 在我们访问“relatives”之前
[('call_count2', 0), ('name', 'Jhon'), ('occupation', 'Coder')]
>>> Jhon.relatives
'Many relatives.'
>>> sorted(Jhon.__dict__.items()) # 在访问`relatives`之后
[('call_count2', 0), ..., ('relatives', 'Many relatives.')]
>>> Jhon.call_count2
0
>>> sorted(Jhon.__dict__.items())
[('call_count2', 0), ('name', 'Jhon'), ('occupation', 'Coder'), ('relatives', 'Many relatives.')]
>>> Jhon.parents
'Father and mother'
>>> Jhon.call_count2
1
>>> sorted(Jhon.__dict__.items())
[('_lazy__parents', 'Father and mother'), ('call_count2', 1), ..., ('relatives', 'Many relatives.')]
>>> Jhon.parents
'Father and mother'
"""
if __name__ == "__main__":
import doctest
doctest.testmod(optionflags = doctest.ELLIPSIS)
创作模式:懒汉式创建方法【类下的自己叫方法】
最新推荐文章于 2022-06-23 13:08:05 发布