返回

Python @函数装饰器及用法(超全面解析)

见解分享

Python 函数装饰器:增强函数行为的终极指南

什么是函数装饰器?

Python 中的函数装饰器是一个超级棒的工具,它可以让你在不修改函数源代码的情况下,增强函数的行为。就像个超级英雄,它可以给你原本的函数披上新战袍,赋予它更强大的力量!

装饰器的语法非常简单:

@decorator_function
def original_function():
    # 函数体

这里,decorator_function 是装饰器函数,original_function 是被装饰的函数。装饰器函数就像是给原函数套上了一层外壳,在原函数执行前或后执行特定的逻辑。

内置函数装饰器

Python 内置了几款非常好用的函数装饰器:

  • @staticmethod: 把函数变成静态方法,它不需要实例就可以调用,更像是一个独立的工具类。
  • @classmethod: 把函数变成类方法,它可以接收类作为第一个参数,方便操作类属性和方法。
  • @property: 把方法变成只读属性,让它看起来就像一个属性,用起来更方便。

自定义函数装饰器

除了内置装饰器,你还可以创建自己的自定义装饰器。这就像给自己量身打造一个超级英雄战衣!自定义装饰器的语法如下:

def decorator_function(original_function):
    # 装饰器逻辑
    return new_function

这里,decorator_function 是装饰器函数,original_function 是被装饰的函数,new_function 是新创建的函数。它继承了原函数的行为,并添加了你自定义的逻辑。

用法示例

示例 1:使用 @staticmethod

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

MyClass.static_method()  # 输出:我是静态方法!

示例 2:使用 @classmethod

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

MyClass.class_method()  # 输出:我是类方法,类名为:MyClass

示例 3:使用 @property

class MyClass:
    def __init__(self, name):
        self.name = name

    @property
    def name_property(self):
        return self.name.upper()

my_object = MyClass("John")
print(my_object.name_property)  # 输出:JOHN

示例 4:创建自定义装饰器

def logging_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数:{func.__name__},参数:{args}, {kwargs}")
        result = func(*args, **kwargs)
        print(f"函数执行结果:{result}")
        return result
    return wrapper

@logging_decorator
def add_numbers(a, b):
    return a + b

add_numbers(10, 20)  # 输出:
# 调用函数:add_numbers,参数:10, 20
# 函数执行结果:30

常见问题解答

1. 函数装饰器有什么好处?

  • 增强函数功能,添加新功能
  • 修改函数签名,提高灵活性
  • 控制函数执行方式,实现代码复用

2. 如何使用函数装饰器?

按照语法,在函数前加上@decorator_function即可。

3. 内置函数装饰器有哪些?

@staticmethod、@classmethod、@property

4. 如何创建自定义函数装饰器?

按照自定义装饰器语法,编写装饰器函数并用@符号修饰被装饰的函数。

5. 函数装饰器可以多次使用吗?

可以,多个函数装饰器可以叠加使用,实现更复杂的增强。

结论

函数装饰器就像超级英雄战衣,让 Python 函数拥有更强大的力量。它们不仅可以让你的代码更简洁高效,还可以扩展函数功能,让你专注于核心逻辑。赶快把它们收入你的编程工具箱吧,它们会让你在 Python 世界中如虎添翼!