大家好,欢迎回到“Python五分钟”,我是赛博红兔。今天我来给大家介绍五个最常用的Python装饰器。装饰器是一种特殊的函数,用来在不修改原函数代码的情况下,动态地扩展函数或方法的功能。对装饰器不了解的小伙伴们请先去看看我之前装饰器的教学内容,链接我会放在下面。
1. @staticmethod
@staticmethod 用于定义类的静态方法。当一个方法不涉及任何实例或者类的状态,只是提供一个功能函数时,我们可以使用静态方法。我们在《面向对象编程》的那一集已经具体地介绍过了,链接我会放在下面。我们在这里看一个简单的例子。
class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(5, 3))
这段代码定义了一个名为MathUtils的类,这个类里有一个名为add的静态方法。静态方法意味着它不需要创建类的实例就可以调用。就像这里,我们直接调用了add方法,传入了5和3,结果打印出8。
2. @classmethod
@classmethod 用于定义类方法。类方法的第一个参数是类本身,通常命名为cls。当一个方法需要访问或修改类的状态时,我们会使用类方法。同样,我们在《面向对象编程》的那一集已经具体地介绍过了,链接我会放在下面。我们在这里看一个简单的例子。
class Counter:
count = 0
@classmethod
def increment(cls):
cls.count += 1
Counter.increment()
print(Counter.count)
这段代码定义了一个名为Counter的类。这个类中有一个类变量count,初始值为0。类方法increment通过使用@classmethod装饰器来定义,它接受一个类参数cls,并将类变量count加1。Counter类的increment方法,使得类变量count增加1,然后打印出它的值,结果是1。
3. @property
@property 用于将类的方法转换为只读属性。可以用装饰器来定义getter、setter 和deleter 方法,对类的私有变量在类的外部进行调用、设置和删除操作。
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
else:
raise ValueError("Radius must be positive")
c = Circle(5)
print(c.radius)
c.radius = 10
print(c.radius)
这段代码定义了一个名为Circle的类,它有一个私有变量_radius。这个类还使用了@property装饰器定义了一个名为radius的属性方法。这个属性方法有两个部分:
- 获取器(getter):当我们通过c.radius直接访问时,返回私有变量_radius的值。
- 设置器(setter):当我们通过c.radius = 10设置值时,它首先检查新值是否大于0。如果是,它将新值赋给_radius;否则,它会抛出一个ValueError异常,表示半径必须为正数。
4. @functools.cache
@functools.cache 用于对耗时或资源密集型函数进行缓存,以提高性能。它会记住函数的输入参数和对应的输出结果,下次调用时直接返回缓存结果。当一个函数的结果可以被复用,并且计算过程较为耗时或复杂时,使用缓存装饰器。
import functools
@functools.cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
这段代码定义了一个用来计算斐波那契数列的函数fibonacci,@functools.cache装饰器会缓存这个函数的结果。这样,当函数被调用时,如果参数相同,它会直接返回缓存的结果,而不需要再次计算。这对于递归函数特别有用,因为它可以显著减少重复计算的次数,提高效率。
5. @dataclasses.dataclass
@dataclasses.dataclass 用于简化类的定义,特别是那些主要用于存储数据的类。它自动生成初始化方法、表示方法和比较方法等。
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
p = Person(name="Alice", age=30)
print(p)
我们使用@dataclass装饰器定义了一个名为Person的数据类,这个类有两个属性:name(字符串类型)和age(整数类型)。dataclass装饰器会自动为这个类生成常见的方法,比如__init__初始化对象的属性、__repr__提供对象的字符串表示和__eq__用于比较两个对象是否相等。
以上就是Python最常用的5个装饰器的全部内容,你学会了吗?

Leave a comment