1. 程式人生 > >python裝飾器之函數作用域

python裝飾器之函數作用域

div 函數對象 內置 代碼復用 urn func -i fail 代碼

1.函數作用域LEGB

L:local函數內部作用域

E:enclosing函數內部與內嵌函數之間

G:global全局作用域

B:build-in內置作用域

passline = 60
def func(val):
    passline = 90
    if val >= passline:
        print(pass)
    else:
        print(failed)
    def in_func()
        print(val)
    in_func()

def Max(val1,val2):
    return max(val1,val2)
func(
89) print(Max(90,100))

2.閉包理解與使用

閉包概念:Closure:內部函數中對enclosing作用域的變量進行引用

函數實質與屬性

1:函數是一個對象

2:函數執行完成後內部變量回收

3:函數屬性

4:函數返回值

閉包作用

1:封裝

2:代碼復用

passline = 60#100
def func(val):
    print(%x%id(val))
    passline = 90
    if val >= passline:
        print(pass)
    else:
        print(failed)
    def
in_func():#(val,) print(val) in_func() return in_func f = func(89) f() print(f.__closure__)


29198a8
failed
89
89
(<cell at 0x7fe62bbf42f0: int object at 0x29198a8>,)
[Finished in 0.0s]
def func_150(val):
    passline = 90
    if val >= passline:
        print(%d pass%val)
    
else: print(failed) def func_100(val): passline = 60 if val >= passline: print(%d pass%val) else: print(failed) def set_passline(passline): def cmp(val): if val >= passline: print(pass) else: print(failed) return cmp f_100 = set_passline(60) f_150 = set_passline(90) print(type(f_100)) print(f_100.__closure__) f_100(89) f_100(59) f_150(89) f_150(59)
pass
failed
failed
failed
[Finished in 0.0s]
def my_averge(*arg):
    print(in my_averge)
    return sum(arg)/len(arg)

def my_sum(*arg):
    print(in my_sum)
    return sum(arg)

def dec(func):
    def in_dec(*arg):
        print(in dec arg = , arg)
        if len(arg) == 0:
            return 0
        for val in arg:
            if not isinstance(val, int):
                return 0
        return func(*arg)
    return in_dec

#dec return in_dec -> my_sum
#my_sum = in_dec(*arg)
my_sum = dec(my_sum)
print(my_sum(1, 2, 3, 4, 5))
print(my_sum(1, 2, 3, 4, 5, 6))
print(my_averge(1, 2, 3, 4, 5))
my_averge = dec(my_averge)
print(my_averge(1, 2, 3, 4, 5, 6))
(in dec arg = , (1, 2, 3, 4, 5))
in my_sum
15
(in dec arg = , (1, 2, 3, 4, 5, 6))
0
in my_averge
3
(in dec arg = , (1, 2, 3, 4, 5, 6))
0
[Finished in 0.0s]

3.裝飾器

1:裝飾器用來裝飾函數

2:返回一個函數對象

3:被裝飾函數標識符指向返回的函數對象

4:語法糖 @deco

def dec(func):
    print(call dec)
    def in_dec(*arg):#my_sum
        print(in dec arg = , arg)
        if len(arg) == 0:
            return 0
        for val in arg:
            if not isinstance(val, int):
                return 0
        return func(*arg)
    return in_dec

@dec
def my_sum(*arg):#my_sum = in_dec
    print(in my_sum)
    return sum(arg)

print(my_sum(1, 2, 3, 4, 5))

#my_sum = dec(my_sum)

 
#deco(bar) -> in_deco
#bar = in_deco
#bar() in_deco() bar()
def deco(func):
    def in_deco(x,y):
        print(in deco)
        func(x,y)
    print(call deco)
    return in_deco
@deco
def bar(x,y):
    print(in bar,x+y)
print(type(bar))
bar(1,2)
call dec
(in dec arg = , (1, 2, 3, 4, 5))
in my_sum
15
call deco
<type function>
in deco
(in bar, 3)
[Finished in 0.0s]

python裝飾器之函數作用域