Python3 类的内置属性、内置方法(魔法方法)、常用装饰器

前言

  • 在 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表达式行为。这是异步编程中的一部分,通常与asyncawait关键字一起使用

其他

  • __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.patchunittest.mock模块):在测试期间模拟或替换对象、函数等

推荐阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值