装饰器
在Python中,装饰器(Decorator)是一种特殊的函数,它可以修改其他函数的行为。装饰器通常用于在不修改原函数代码的情况下,给函数添加额外的功能。可以将装饰器理解为“包装器”,它可以将一个函数“包装”起来,并返回一个新的函数。
def convert_upper(f):
print("convert_upper")
def wrap(*args, **kwargs):
print("wrap")
x = f(*args, **kwargs)
return x.upper()
return wrap
@convert_upper
def my_name(name):
print("my_name")
return name
上下文管理器
在Python中,with语句和contextmanager装饰器一起使用可以创建一个上下文管理器(Context Manager)。上下文管理器可以用来管理资源的分配和释放,例如文件、网络连接、锁等。
contextmanager装饰器是一个生成器函数,它可以将生成器函数转换为上下文管理器。生成器函数需要使用yield语句来暂停和恢复执行,以允许with语句在进入和退出上下文时执行某些操作。
import contextlib
@contextlib.contextmanager
def propagater(name, propagate):
try:
yield
print(name, 'exited normally.')
except Exception:
print(name, 'received an exception!')
if propagate:
raise
静态方法&类方法
- classmethod(类方法):classmethod装饰器定义的方法接受的第一个参数是类对象(cls),而不是实例对象(self)。类方法通常用于对类进行操作,例如创建新的实例对象或修改类属性。
- staticmethod(静态方法):staticmethod装饰器定义的方法没有默认的参数,既不需要传递实例对象,也不需要传递类对象。静态方法通常用于对类进行操作,但不需要访问实例对象或类对象。
class MyClass:
class_var = 0
def __init__(self, instance_var):
self.instance_var = instance_var
@classmethod
def class_method(cls, x):
cls.class_var += x
print("class_var:", cls.class_var)
@staticmethod
def static_method():
print("This is a static method.")
# 调用类方法
MyClass.class_method(10)
# 创建实例对象
obj = MyClass(20)
# 调用静态方法
obj.static_method()