python裝飾器執行機制
阿新 • • 發佈:2017-09-18
abc print 前沿 spl ini self. color ret instance
前沿:
首先是看到了單例模型,想不明白 outer中的參數 為什麽能像 global的參數 一樣屹立不倒。
#單例模型 def single_model(cls): instance = {} def inner(*args, **kwargs): print if cls not in instance: instance[cls] = cls(*args, **kwargs) print ‘cls not in instance‘ return instance[cls]View Codereturn inner @single_model class MyFoo(object): def __init__(self): self.name = ‘wwt‘ self.age = 12 mf1 = MyFoo() mf2 = MyFoo() mf1.name = ‘asfaf‘ print mf2.name print mf1 is mf2 [out:] asfaf True
這樣我就十分奇怪了,但後來將 instance 放在 inner 中單例模型就失敗了,所以問題一定在裝飾器的 outer 上。
1 裝飾器個層級之間的執行順序
def single_model(text): print ‘last_outer ‘ + text def outer(func): instance = {} print ‘instance_outer: %d‘ % id(instance) def inner(*args, **kwargs): if func not in instance: instance[func] = func(*args, **kwargs)print ‘instance_inner: %d‘ % id(instance) return instance[func] return inner return outer @single_model(‘zhhh‘) def func(): return ‘hahahha‘ con1 此時此刻執行程序 [out:] last_outer zhhh instance_outer: 31691640 # 也就是說裝飾器創建後,他會在func調用前執行。 ----------------------------------------------- con2 調用函數 abc = func() efg = func() print abc, efg [out:] last_outer zhhh instance_outer: 30905208 instance_inner: 30905208 hahahha hahahha # 如果在outer或更outer層定義了對象(instance)並在inner層引用,則該對象不會被GC,會存在, # 類似於global
2 裝飾器
python裝飾器執行機制