赞
踩
1 class ObjectDict(dict): 2 def __init__(self, *args, **kwargs): 3 super(ObjectDict, self).__init__(*args, **kwargs) 4 5 def __getattr__(self, name): 6 value = self[name] 7 if isinstance(value, dict): 8 value = ObjectDict(value) 9 return value 10 11 if __name__ == '__main__': 12 od = ObjectDict(asf={'a': 1}, d=True) 13 print od.asf, od.asf.a # {'a': 1} 1 14 print od.d # True
1 class WidgetShowLazyLoad(object): 2 def fetch_complex_attr(self, attrname): 3 '''可能是比较耗时的操作, 比如从文件读取''' 4 return attrname 5 6 def __getattr__(self, name): 7 if name not in self.__dict__: 8 self.__dict__[name] = self.fetch_complex_attr(name) 9 return self.__dict__[name] 10 11 if __name__ == '__main__': 12 w = WidgetShowLazyLoad() 13 print 'before', w.__dict__ 14 w.lazy_loaded_attr 15 print 'after', w.__dict__
import functools class lazy_attribute(object): """ A property that caches itself to the class object. """ def __init__(self, func): functools.update_wrapper(self, func, updated=[]) self.getter = func def __get__(self, obj, cls): value = self.getter(cls) setattr(cls, self.__name__, value) return value class Widget(object): @lazy_attribute def complex_attr_may_not_need(clz): print 'complex_attr_may_not_need is needed now' return sum(i*i for i in range(1000)) if __name__ == '__main__': print Widget.__dict__.get('complex_attr_may_not_need') # <__main__.lazy_attribute object at 0x02B12450> Widget.complex_attr_may_not_need # complex_attr_may_not_need is needed now print Widget.__dict__.get('complex_attr_may_not_need') # 332833500
class adaptee(object): def foo(self): print 'foo in adaptee' def bar(self): print 'bar in adaptee' class adapter(object): def __init__(self): self.adaptee = adaptee() def foo(self): print 'foo in adapter' self.adaptee.foo() def __getattr__(self, name): return getattr(self.adaptee, name) if __name__ == '__main__': a = adapter() a.foo() a.bar()
class AlgoImpA(object): def __init__(self): self.obj_attr = 'obj_attr in AlgoImpA' def foo(self): print 'foo in AlgoImpA' def bar(self): print 'bar in AlgoImpA' class AlgoImpB(object): def __init__(self): self.obj_attr = 'obj_attr in AlgoImpB' def foo(self): print 'foo in AlgoImpB' def bar(self): print 'bar in AlgoImpB' class Algo(object): def __init__(self): self.imp_a = AlgoImpA() self.imp_b = AlgoImpB() self.cur_imp = self.imp_a def switch_imp(self): if self.cur_imp == self.imp_a: self.cur_imp = self.imp_b else: self.cur_imp = self.imp_a def __str__(self): return 'Algo with imp %s' % str(self.cur_imp) def __getattr__(self, name): return getattr(self.cur_imp, name) if __name__ == '__main__': algo = Algo() print algo print algo.obj_attr algo.foo() algo.switch_imp() print algo print algo.obj_attr algo.bar()
Algo with imp <__main__.AlgoImpA object at 0x02AA2270>
obj_attr in AlgoImpA
foo in AlgoImpA
Algo with imp <__main__.AlgoImpB object at 0x02AA22B0>
obj_attr in AlgoImpB
bar in AlgoImpB
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。