Python装饰器实例

"""
通用装饰器的写法:
def wrapper(fn): # wrapper: 装饰器, fn: 目标函数
    def inner(*args, **kwargs):
        # 在目标函数执行之前……
        ret = fn(*args, **kwargs) # 执行目标函数
        # 在目标函数执行之后……
        return ret
    return inner

@wrapper
def target():
    pass

target() # => inner()

一个函数可以被多个装饰器装饰
@wrapper1
@wrapper2
def target():
    print('我是目标函数')
结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1

"""

# 例子1
def guanjia(game):
    # *,** 表示接收所有参数,打包成元组和字典
    def inner(*args, **kwargs): # inner添加了参数,args元组,kwargs字典
        print("打开外挂")
        # *,** 表示把args元组和kwargs字典打散成位置参数以及关键字参数传递进去
        game(*args, **kwargs) 
        print("关闭外挂")
    return inner

@guanjia
def play_dnf(username, password):
    print("开始玩dnf", username, password)

@guanjia
def play_lol(username, password, hero):
    print("开始玩lol", username, password, hero)

play_dnf("admin", "123456")
play_lol("admin", "123456", "xxx")

# 多个wrapper例子
def wrapper1(fn): # fn: wrapper2.inner
    def inner(*args, **kwargs):
        print("这是wrapper1 进入")
        ret = fn(*args, **kwargs) # wrapper2.inner
        print("这是wrapper1 出去")
        return ret
    return inner

def wrapper2(fn): # fn: target
    def inner(*args, **kwargs):
        print("这是wrapper2 进入")
        ret = fn(*args, **kwargs) # target
        print("这是wrapper2 出去")
        return ret
    return inner

@wrapper1 # target = wrapper1(wrapper2.inner) => target: wrapper1.inner
@wrapper2 # target = wrapper2(target) => target: wrapper2.inner
def target():
    print("我是目标")

target() # 结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1

# 登录后增删改查例子
login_flag = False
def login_verify(fn):
    def inner(*args, **kwargs):
        global login_flag
        if login_flag == False:
            # 这里做登陆校验
            while 1:
                username = input(">>>")
                password = input(">>>")
                if username == 'admin' and password == '123':
                    print("登录成功")
                    login_flag = True
                    break
                else:
                    print("登录失败,用户名或密码错误")
        ret = fn(*args, **kwargs) # 后续程序的执行
        return ret
    return inner

@login_verify
def add():
    print("增加信息")

@login_verify
def del():
    print("删除信息")

@login_verify
def update():
    print("修改信息")

@login_verify
def search():
    print("查询信息")

add()

### Python装饰器的使用示例 #### 基本概念 装饰器是一种特殊类型的函数,它可以返回另一个函数并增强其功能。通过这种方式,可以在不修改原始函数代码的情况下为其添加额外的行为[^1]。 #### 函数装饰器示例 下面是一个简单的函数装饰器示例,展示了如何在函数执行前后打印日志: ```python def log_decorator(func): def wrapper(*args, **kwargs): print(f"Logging before function {func.__name__} is called.") result = func(*args, **kwargs) print(f"Logging after function {func.__name__} has been executed.") return result return wrapper @log_decorator def greet(name): print(f"Hello, {name}") greet("Alice") ``` 在这个例子中,`log_decorator` 是一个装饰器,它会在 `greet` 函数执行前和执行后分别打印一条日志消息[^3]。 #### 类装饰器示例 除了函数装饰器外,还可以使用类来实现装饰器的功能。这需要定义一个带有 `__call__` 方法的类[^2]。以下是基于类的装饰器的一个实例: ```python class MyDecorator: def __init__(self, str_param): print("Inside MyDecorator.__init__()") self.str_param = str_param print(self.str_param) def __call__(self, func): def wrapped(*args, **kwargs): print("Before the decorated function call.") func(*args, **kwargs) print("After the decorated function call.") print("Inside MyDecorator.__call__()") return wrapped @MyDecorator('This is a string parameter') def another_function(): print("Inside another_function()") another_function() ``` 在此代码片段中,`MyDecorator` 是一个类装饰器,当被应用于 `another_function` 时,会自动调用它的 `__call__` 方法,并在其内部封装目标函数逻辑[^4]。 --- ### 性能计时装饰器示例 为了展示更实用的应用场景,这里给出一个用于测量函数运行时间的装饰器: ```python import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() elapsed_time = end_time - start_time print(f"{func.__name__} took {elapsed_time:.6f}s to execute.") return result return wrapper @timer_decorator def compute-heavy_task(n): total = sum(i * i for i in range(1, n)) return total compute-heavy_task(1000000) ``` 此装饰器可以用来监控任何耗时较长的操作,并报告它们的具体消耗时间[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值