1. 程式人生 > >python裝飾器執行機制

python裝飾器執行機制

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]
    
return 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
View Code

這樣我就十分奇怪了,但後來將 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裝飾器執行機制