Pythondecorate

pythondecorate #

装饰器基本语法 #

@decorator
def target_function():
    pass

等价于:

def target_function():
    pass
target_function = decorator(target_function)

无参装饰器 #

def simple_decorator(func):
    def wrapper(*args, **kwargs):
        print("函数执行前")
        result = func(*args, **kwargs)
        print("函数执行后")
        return result
    return wrapper

@simple_decorator
def say_hello(name):
    print(f"Hello, {name}!")

带参装饰器 #

def param_decorator(level="INFO"):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"[{level 函数开始执行")
            result = func(*args, **kwargs)
            print(f"[{level 函数执行结束")
            return result
        return wrapper
    return decorator

@param_decorator("DEBUG")
def test_function():
    print("测试函数")

类装饰器 #

class ClassDecorator:
    def __init__(self, func):
        self.func = func
        self.call_count = 0
    
    def __call__(self, *args, **kwargs):
        self.call_count += 1
        print(f"函数被调用第{self.call_count}次")
        return self.func(*args, **kwargs)

@ClassDecorator
def my_function():
    print("函数执行")

多个装饰器叠加 #

@decorator1
@decorator2
@decorator3
def function():
    pass

# 执行顺序:decorator3 → decorator2 → decorator1

@staticmethod #

class MyClass:
    @staticmethod
    def static_method():
        print("静态方法")

@classmethod #

class MyClass:
    @classmethod
    def class_method(cls):
        print(f"类方法,类名:{cls.__name__}")

@property #

class Person:
    def __init__(self, name):
        self._name = name
    
    @property
    def name(self):
        return self._name
    
    @name.setter
    def name(self, value):
        self._name = value

元信息丢失 #

def my_decorator(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

@my_decorator
def example():
    """示例函数"""
    pass

print(example.__name__)  # 输出:wrapper(不是example)

元信息丢失解决方案 #

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

日志记录 #

def log_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"调用函数:{func.__name__}")
        print(f"参数:args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"返回值:{result}")
        return result
    return wrapper

性能测试 #

import time

def timer_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行时间:{end_time - start_time:.4f}秒")
        return result
    return wrapper

权限验证 #

def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not is_logged_in():
            return "请先登录"
        return func(*args, **kwargs)
    return wrapper

缓存机制 #

def cache_decorator(func):
    cache = {}
    @wraps(func)
    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper

装饰器工厂模式 #

def decorator_factory(condition=True):
    def decorator(func):
        if condition:
            # 添加功能
            @wraps(func)
            def wrapper(*args, **kwargs):
                print("装饰器生效")
                return func(*args, **kwargs)
            return wrapper
        else:
            # 直接返回原函数
            return func
    return decorator

可选参数装饰器 #

def smart_decorator(arg=None):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if callable(arg):
                # 无参调用
                print("无参装饰器")
            else:
                # 有参调用
                print(f"参数为:{arg}")
            return func(*args, **kwargs)
        return wrapper
    
    if callable(arg):
        # @smart_decorator
        return decorator(arg)
    else:
        # @smart_decorator(...)
        return decorator