装饰器案例 python

一 装饰器

 作用是为了将一个子模块加入新的功能,但是不修改原有的代码

二 案例

def operate(func):
    
    def wrapper(*args, **kwargs):  # 闭包函数        
        value = func(*args, **kwargs)
        print(value, args, kwargs)
                
        return value    
    return wrapper


@operate
def start_func(count, second="yes"):
    count = count * 10
    print("这里是加了装饰器的函数 %d" %  count)
    
    return count
    
    
start_func(10, second="no") 

输出:

这里是加了装饰器的函数 100
100 (10,) {'second': 'no'}
100

  

 

 # 不含参数的装饰器

## 不含参数的装饰器

def jump_func(funcName):
    
    def build_in(a, b, c):   # 这个函数要与 start_entrance 函数参数一致
        
        b = "woman"
        print("-----before-----", a, b, c)
        change = funcName(a, b, c)
        print("-----after------", change)
        return change
    
    return build_in

@jump_func
def start_entrance(name, sex, age):
    
#     sex = "crazy"
#     age = 18
    print("stat func:", name, sex, age)
    return (name, sex, age)

result = start_entrance("honer", "man", 78)

输出:

-----before----- honer woman 78
stat func: honer woman 78
-----after------ ('honer', 'woman', 78)

  

有参数的装饰器

# 传递带有参数的装饰器,能在运行时,处理不同的功能
"""
1 先执行 trans_args("start") 函数,这个函数return 的结果是func这个函数的引用
2 @func
3 使用 @func 对start_entrance 进行装饰
"""


def trans_args(arg):
    
    def func(funcName):
        
        def build_in():
            if arg == "start":  # 装饰器里的参数
                result = funcName()
                print(result)
                return result
            else:
                result = funcName()
                return "not comparable"
            
            
        return build_in    
    return func


@trans_args("start")
def start_entrance():
    
    wrap = "嵌入其中的函数"
    print(wrap)
    return wrap

res = start_entrance()

@trans_args("from")
def from_entrance():
    variable = "hello, world"
    print(variable)
    return variable

from_entrance()

 输出:

嵌入其中的函数
嵌入其中的函数
hello, world
'not comparable'

 

  

 

 

posted @ 2022-04-28 13:53  谦曰盛  阅读(78)  评论(0编辑  收藏  举报