装饰器decorator

  

只加强一次功能的装饰器:

print('/\\')
print('/\ta')

def b(fn):
    def wrapper():
        print('bbbbb')
        return fn
    return wrapper()

@b
def p():
    print(111111111)
    print(p)

p()
p()

 

 

 

 

def b(fn):
    def wrapper(*args,**kwargs):
        print('bbbbb')
        return fn
    return wrapper

@b
def p():
    print(111111111)
    print(p)

p()
print()
print(p())
print()
print(p()())
print()
print(p)
print(dir())

 函数p确实被包装了,p已经变成了<function b.<locals>.wrappers at 0x00000>,其返回值为p,p可以继续调用

 

from functools import wraps
def b(fn):
    @wraps(fn)
    def wrapper(*args,**kwargs):
        print('bbbbbbbbbb')
        return fn(*args,**kwargs)
    return wrapper

@b
def p():
    print('pppppppppppp')
    return '2222222222'

print(p)
print(p(),p.__name__)

 

 

 

def b(fn):
    def wrapper(*args,**kwargs):
        print('b'*60)
        print('wrapper dir ->',dir())
        return fn(*args,**kwargs)
    print('fn ->',fn,fn.__name__)
    print('funtion b dir ->',dir())
    return wrapper
print('after b dir ->',dir())
@b
def p():
    print('p'*60)
    print('p local variables',locals())
    print('global variables',globals())
    print('p in globals?','p' in globals())
    # print(p)

print('p =',p)
print(dir(b))
print(b.__dict__)

 

 fn是局部变量,出栈后销毁,fn.__name__ == 'p', 但是 "p" 不是变量,装饰的过程即是执行装饰函数,最后执行结果赋给变量 p

 

posted @ 2020-11-11 14:38  ascertain  阅读(72)  评论(0编辑  收藏  举报