python的魔法方法,可以为我们自定义的类添加一些额外的功能。也可以说,python的许多特性,都是通过魔法方法实现的。我们自定义的类里如果实现了这些魔法方法,也就拥有了python的这些特性。
类似于鸭子类型的概念,也就是你实现了鸭子的行为,那你就是鸭子类型
下面是一些常见的魔法方法和它们对应的特性。假定当前类名为 Test
方法 | 调用 | 解释 | 用途 |
---|---|---|---|
__new__(cls) | t = Test() | 创建类实例的方法,接收参数为类本身,返回新的实例 | 单例模式 |
__init__(self) | t = Test() | 初始化实例。在__new__(cls) 之后执行 | |
__del__(self) | del t | 删除实例或者关闭时调用。一般不需要手动调用 | 数据连接类,可用于断开数据库连接 |
__call__(self) | t() | 实例被调用时 | 类装饰器,实例作为可调用对象时 |
__str__(self) | print(t) | 打印输出实例 | 给实例或者类添加文字说明 |
__getattr__(self, attr) | s.name 且name属性不存在时 | 调用实例不存在的属性或方法时调用 | 可以实现动态匹配 |
__setattr__(self, attr) | s.name='zhang' | 给属性赋值 | |
__delattr__(self, attr) | del s.name | 删除属性 | |
__getitem__(self, item) | t[0] | 根据索引获取值或切片时调用 | 实现列表的特性 |
__setitem__(self, item) | t[0]=1 | 根据索引赋值 | |
__delitem__(self, item) | del t[0] | 删除索引值 | |
__getattribute__(self, attr) | getattr(t, attr) | 使用反射获取值时调用 | 反射的实现 |
__eq__(self, other) | t==1 | 用==判断时调用 | 注意==的使用 |
__bool__(self) | if t: 或者 bool(t) | 获取实例的bool 值 | 注意此处的判断 |
__index__(self) | [1,2][t] | t被当做索引值时调用 | |
__iter__(self) | for i in t | 可迭代对象。返回一个迭代器实例 | 可迭代对象 |
__next__(self) | next(t) | 迭代器 | 可迭代对象 |
__contains__(self, value) | "aa" in t | 使用in 或not in | 实现序列的特性 |
__enter__(self) | with t as e | 上下文管理器进入时,需要返回实例 | 上下文管理器 |
__exit__(self, exc, val, trace) | with t as e | 上下文管理器关闭时 | |
__len__(self) | len(t) | 获取长度 | 序列的特性 |