前言
- 在 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
Python 3 类属性、方法与装饰器归纳
2362

被折叠的 条评论
为什么被折叠?



