前言
- 在 Python 3 中,类的内置属性和特殊方法(魔法方法)提供了非常丰富的功能和灵活性
- 同时,一些内置的装饰器、常用的装饰器也起到了很棒的效果
- 为了方便各位查阅, 笔者尽最大努力地归纳了 Python 3 中类的属性、特殊方法(魔法方法)和 一些装饰器
- 希望本文能够帮助到你
类
内置属性
常见
__name__
:类的名称(字符串)__doc__
:类的文档字符串(字符串)或None
(如果没有定义)__module__
:类定义所在的模块名称(字符串)__bases__
:类的所有基类构成的元组(对于内置类型,可能为空或包含object
)__dict__
:类的属性(包括方法)构成的字典。注意,对于内置类型,这个字典可能不包含有用的信息__class__
:在实例上使用时,指向实例的类;在类上使用时,通常返回type
或其元类__mro__
:类的方法解析顺序(MRO)列表,用于确定继承时方法调用的顺序
其他
-
__annotations__
:类的注解字典,用于存储变量注解和函数注解(Python 3.7+) -
__qualname__
:类的限定名(包括其包、模块和父类) -
__subclasshook__()
:一个类方法,用于自定义子类检查。当使用issubclass()
函数检查一个类是否是另一个类的子类时,如果第一个类定义了__subclasshook__()
方法,则会调用该方法
内置方法 (魔法方法)
构造和初始化
__new__(cls, [...])
:用于创建并返回类的实例的特殊静态方法,通常在__init__()
之前被调用__init__(self, [...])
:在实例创建后调用,用于初始化实例__del__(self)
:在实例被销毁前调用,用于执行清理操作__init_subclass__(cls, **kwargs)
: 当一个类被继承时调用,在子类的__init__
方法之前
运算符重载
__add__(self, other)
:定义加法运算符+
的行为__sub__(self, other)
:定义减法运算符-
的行为__mul__(self, other)
:定义乘法运算符*
的行为__truediv__(self, other)
:定义真除法运算符/
的行为__floordiv__(self, other)
:定义地板除法运算符//
的行为__mod__(self, other)
:定义取模运算符%
的行为__pow__(self, other[, modulo])
:定义乘方运算符**
或**=
的行为__iadd__(self, other)
:定义加法赋值运算符+=
的行为__isub__(self, other)
:定义减法赋值运算符-=
的行为__imul__(self, other)
:定义乘法赋值运算符*=
的行为__itruediv__(self, other)
:定义真除法赋值运算符/=
的行为__ifloordiv__(self, other)
:定义地板除法赋值运算符//=
的行为__imod__(self, other)
:定义取模赋值运算符%=
的行为__ipow__(self, other[, modulo])
:定义乘方赋值运算符**=
的行为__neg__(self)
:定义取反运算符-
的行为__pos__(self)
:定义取正运算符+
的行为__abs__(self)
:定义绝对值函数abs()
的行为__invert__(self)
:定义按位取反运算符~
的行为__lt__(self, other)
:定义小于运算符<
的行为__le__(self, other)
:定义小于等于运算符<=
的行为__eq__(self, other)
:定义等于运算符==
的行为__ne__(self, other)
:定义不等于运算符!=
的行为__gt__(self, other)
:定义大于运算符>
的行为__ge__(self, other)
:定义大于等于运算符>=
的行为__or__(self, other)
:定义集合的并集运算符|
的行为__and__(self, other)
:定义集合的交集运算符&
的行为__sub__(self, other)
:定义集合的差集运算符-
的行为__xor__(self, other)
:定义集合的对称差集运算符^
的行为__divmod__(self, other)
:定义divmod()
函数的行为(返回包含商和余数的元组)__round__(self, ndigits=None)
:定义round()
函数的行为
类型检查和转换
__index__(self)
:返回对象用于切片、索引和迭代运算的整数__bool__(self)
: 定义布尔值测试的行为(用于bool()
函数)__int__(self)
: 定义转换为整数的行为(用于int()
函数)__float__(self)
: 定义转换为浮点数的行为(用于float()
函数)__complex__(self)
: 定义转换为复数的行为(用于complex()
函数)__instancecheck__(self, instance)
: 定义isinstance()
函数的行为__subclasscheck__(self, subclass)
: 定义issubclass()
函数的行为
可调用对象
__call__(self, [...])
:定义对象作为函数调用的行为(允许类的实例像函数一样被调用)
反射和自省
__dir__(self)
:当使用dir()
函数时调用,返回属性列表__class__(self)
:返回对象的类__class_getitem__(cls, item)
: 在Python 3.7+中,定义对类使用方括号索引的行为(如List[int]
)
垃圾回收
__del__(self)
:当对象即将被垃圾回收器回收时调用__finalize__(self)
:当对象被垃圾回收器回收前调用,通常与weakref.finalize()
一起使用
属性描述符
__get__(self, instance, owner)
:用于访问属性值的描述符方法__set__(self, instance, value)
:用于修改属性值的描述符方法__delete__(self, instance)
:用于删除属性值的描述符方法
属性访问与管理
-
__get__(self, instance, owner)
:用于描述符,当访问属性时被调用 -
__set__(self, instance, value)
:用于描述符,当设置属性时被调用(不管设置什么属性,都会触发) -
__delete__(self, instance)
:用于描述符,当删除属性时被调用 -
__getattr__(self, name)
:当尝试访问不存在的属性时调用 -
__getattribute__(self, name)
:在访问任何属性时都会调用,无论该属性是否存在(这是一个强大的方法,但因为它会在每次访问属性时都被调用,所以使用时要特别小心以避免性能问题) -
__setattr__(self, name, value)
:只在某属性赋值时被调用(即:定义"当设置某个属性时"的行为,有点类似于__init__
,但它在每次属性赋值时都会被调用) -
与
__set__
不同——它是对所有属性赋值都起作用的通用方法__delattr__(self, name)
:在属性删除时调用
容器类型
__len__(self)
:返回容器的长度__getitem__(self, index)
:获取序列中指定索引的元素__setitem__(self, index, value)
:设置序列中指定索引的元素的值__delitem__(self, index)
:删除序列中指定索引的元素__contains__(self, item)
:定义in
运算符的行为,即检查容器中是否包含指定的元素__iter__(self)
:定义迭代的行为__missing__(self, key)
: 在字典子类中,当尝试访问不存在的键时调用__reversed__(self)
: 返回一个迭代器,用于反转容器中的元素
字符串和字节序列
__str__(self)
:定义str()
函数的行为,即:返回对象的非正式字符串表示(通常用于print()
函数)__format__(self, format_spec)
: 定义对象的格式化字符串表示(用于format()
函数)__bytes__(self)
:定义转换为字节序列的行为(用于bytes()
函数)__bytearray__(self)
:定义转换为字节数组的行为(用于bytearray()
函数__repr__(self)
: 返回对象的官方字符串表示(通常用于repr()
函数和调试)
上下文管理
__enter__(self)
:定义with
语句开始时的行为__exit__(self, exc_type, exc_val, exc_tb)
:定义with
语句结束时的行为
迭代器
__iter__(self)
:返回迭代器对象本身,用于迭代协议__next__(self)
:返回迭代器的下一个元素,或在迭代完成时引发StopIteration
异常
描述符
__set_name__(self, owner, name)
: 当描述符被赋值给类的属性时调用。这是Python 3.6 引入的新方法
哈希
__hash__(self)
:定义对象的哈希值,用于哈希表(如字典)中的键
类型检查
__instancecheck__(self, instance)
:用于isinstance()
函数,检查实例是否是类的实例__subclasscheck__(self, subclass)
:用于issubclass()
函数,检查一个类是否是另一个类的子类
复制和pickle
__copy__(self)
:返回对象的浅拷贝__deepcopy__(self, memo)
:返回对象的深拷贝__reduce__(self)
:返回一个元组,用于pickle
模块保存和恢复对象的状态__reduce_ex__(self, protocol)
:类似于__reduce__
,但允许指定pickle协议
序列化和反序列化
__getstate__(self)
: 当使用pickle
模块序列化对象时调用,返回需要持久化的状态信息__setstate__(self, state)
: 当使用pickle
模块反序列化对象时调用,使用__getstate__
返回的状态信息来恢复对象状态
异步编程
__aiter__(self)
: 定义异步迭代器的__aiter__()
方法__anext__(self)
: 定义异步迭代器的__anext__()
方法,返回迭代器的下一个值__aenter__(self)
: 定义异步上下文管理器的__aenter__()
方法__aexit__(self, exc_type, exc_val, exc_tb)
: 定义异步上下文管理器的__aexit__()
方法__await__(self)
: 定义对象的await
表达式行为。这是异步编程中的一部分,通常与async
和await
关键字一起使用
其他
-
__subclasses__()
:返回类的直接子类列表(注意:这是一个动态生成的列表,因为新的子类可以在运行时被创建) -
__prepare__()
:在元类中用于定制类的命名空间的特殊方法
装饰器
标准库中的装饰器
-
@staticmethod:在类内定义静态方法,该方法不需要特定的类实例即可调用,也不自动传递类实例或类本身作为第一个参数
-
@classmethod:定义类方法,该方法将类本身作为第一个参数(通常命名为
cls
),而不是类的实例 -
@property:将一个方法转换为属性,允许你像访问数据属性一样调用它(常用于定义计算属性或提供数据的只读访问)【读取属性】
-
@property.setter:与
@property
一起使用,用于定义属性的设置方法(允许你定义如何设置属性值)【修改属性】 -
@property.deleter:与
@property
一起使用,用于定义属性的删除方法(允许你定义如何删除属性)【删除属性】 -
@abstractmethod(来自
abc
模块):在抽象基类中定义一个方法,子类必须实现它,否则子类也是抽象的,不能被实例化 -
@wraps(来自
functools
模块):用于在创建装饰器时保留被装饰函数的元信息,如函数名、docstring等 -
@lru_cache(来自
functools
模块):实现最近最少使用(LRU)缓存策略,用于缓存函数调用的结果,提高性能 -
@singledispatch(来自
functools
模块):实现单分派通用函数,根据第一个参数的类型调用不同的实现 -
@dataclass(来自
dataclasses
模块):用于自动生成特殊方法(如__init__
和__repr__
),使数据类更简洁 -
@contextmanager(来自
contextlib
模块):简化上下文管理器的编写,使其基于生成器
第三方库中的装饰器
- @login_required(Web框架如Flask-Login):确保用户已登录
- @cache_page(Django):缓存整个页面响应的内容
- @transaction.atomic(Django ORM):确保数据库操作是原子性的
- @api_view(Django REST framework):将视图函数转换为API视图
- @async_to_sync(Django Channels):将异步函数转换为同步函数
- @mock.patch(
unittest.mock
模块):在测试期间模拟或替换对象、函数等
推荐阅读
-
super 函数讲解:https://zhuanlan.zhihu.com/p/356720970