python中那些可爱的语法糖

116 阅读2分钟

装饰器

image.png

在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

上下文管理器

image.png

在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

静态方法&类方法

image.png

  1. classmethod(类方法):classmethod装饰器定义的方法接受的第一个参数是类对象(cls),而不是实例对象(self)。类方法通常用于对类进行操作,例如创建新的实例对象或修改类属性。
  2. 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()