阿里云天池Python训练营
本节主要介绍python中的魔法方法,并针对相关用法进行展开说明。其中拓展了需要掌握及区别的内容,对于魔法方法的含义需重点掌握。
一、魔法方法
魔法方法总能够在适当的时候被自动调用
魔法方法的第一个参数应为cls(类方法) 或者self(实例方法)
cls:类的名称
self:实例对象的名称
1. 基本的魔法方法
__init__(self[, ...])
创建实例时 调用的初始化方法
__new__(cls[, ...])
对象实例化时调用的第一个方法(调用__init__前先调用__new__)
__new__至少有一个参数cls 代表实例化的类(Python 解释器自动提供)后面的参数传递给__init__
__new__实例化当前类 传给__init__的self (只有__new__返回当前类cls的实例 才会进入__init__)
若__new__没有正确返回当前类cls的实例 不会被调用__init__ 父类的实例也不可以
__new__用于继承不可变的 class(int str tuple) 时 提供一个自定义类实例化过程的途径
__del__(self)
当对象被系统回收时调用的方法
Python 采用自动引用计数(ARC)方式来回收对象所占用的空间 当对象的引用计数变成了 0 Python 就会回收该对象
系统中出现循环引用的情况 由专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收引用循环
__str__(self):
打印一个对象时 触发__str__
使用%s格式化时 触发__str__
str强转数据类型时 触发__str__
__repr__(self):
有__str__时执行__str__ 没有实现__str__时 执行__repr__
repr(obj)的结果是__repr__返回值
使用%r格式化的时候 触发__repr__
__str__(self) 结果可读性强 __str__ 可以得到便于阅读的信息
__repr__(self) 结果更准确 __repr__ 常用于调试 便于开发者使用
2. 算术运算符
类型工厂函数 不通过类而是通过函数来创建对象
__add__(self, other)
加法的行为:+
__sub__(self, other)
减法的行为:-
__mul__(self, other)
定法的行为:*
__truediv__(self, other)
除法的行为:/
__floordiv__(self, other)
整数除法的行为://
__mod__(self, other)
取模算法的行为:%
__divmod__(self, other)
divmod() 调用行为
divmod(a, b)把除数和余数运算结果结合起来 返回一个包含商和余数的元组(a // b, a % b)
__pow__(self, other[, module])
power() 调用或幂运算行为:**
__lshift__(self, other)
按位左移位的行为:<<
__rshift__(self, other)
按位右移位的行为:>>
__and__(self, other)
按位与操作的行为:&
__xor__(self, other)
按位异或操作的行为:^
__or__(self, other)
按位或操作的行为:|
3. 反算术运算符
反运算魔方方法 在魔法方法多了一个“r”
当文件左操作不支持相应的操作时被调用
__radd__(self, other)
加法的行为:+
__rsub__(self, other)
减法的行为:-
__rmul__(self, other)
定法的行为:*
__rtruediv__(self, other)
除法的行为:/
__rfloordiv__(self, other)
整数除法的行为://
__rmod__(self, other)
取模算法的行为:%
__rdivmod__(self, other)
divmod() 调用行为
__rpow__(self, other[, module])
power() 调用或幂运算行为:**
__rlshift__(self, other)
按位左移位的行为:<<
__rrshift__(self, other)
按位右移位的行为:>>
__rand__(self, other)
按位与操作的行为:&
__rxor__(self, other)
按位异或操作的行为:^
__ror__(self, other)
按位或操作的行为:|
4. 增量赋值运算符
__iadd__(self, other)
加法的行为:+=
__isub__(self, other)
减法的行为:-=
__imul__(self, other)
定法的行为:*=
__itruediv__(self, other)
除法的行为:/=
__ifloordiv__(self, other)
整数除法的行为://=
__imod__(self, other)
取模算法的行为:%=
__ipow__(self, other[, module])
幂运算的行为:**=
__ilshift__(self, other)
按位左移位的行为:<<=
__irshift__(self, other)
按位右移位的行为:>>=
__iand__(self, other)
按位与操作的行为:&=
__ixor__(self, other)
按位异或操作的行为:^=
__ior__(self, other)
按位或操作的行为:|=
5. 一元运算符
__neg__(self)
正号的行为:+x
__pos__(self)
负号的行为:-x
__abs__(self)
绝对值行为:|x|
__invert__(self)
按位求反的行为:~x
6. 属性访问
__getattr__(self, name):
试图获取不存在的属性时的行为
__getattribute__(self, name):
类的属性被访问时的行为(先调用方法查看是否存在该属性 若不存在则调用__getattr__)
__setattr__(self, name, value):
设置属性时的行为
__delattr__(self, name):
删除属性时的行为
7. 描述符
描述符将特殊类型的类的实例指派给另一个类的属性
__get__(self, instance, owner)
访问属性 返回属性值
__set__(self, instance, value)
将在属性分配操作中调用
__del__(self, instance)
删除操作
8. 定制序列
容器类型的协议
容器是不可变的 只需定义__len__()和__getitem__()方法
容器是可变的 需要定义__len__() __getitem__() __setitem__()和__delitem__()方法
__len__(self)
调用len()的行为(返回容器中元素的个数)
__getitem__(self, key)
获取容器中元素的行为(self[key])
__setitem__(self, key, value)
设置容器中元素的行为(self[key] = value)
__delitem__(self, key)
删除容器中元素的行为(del self[key])
9. 迭代器
迭代器是访问集合元素的一种方式 可以记住遍历位置的对象
迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问后结束 (只往前不后退)
字符串 列表或元组对象都可用于创建迭代器
基本的方法:iter() 和 next()
iter(object)
生成迭代器
next(iterator[, default])
返回迭代器的下一个项目
iterator:可迭代对象
default :当没有下一个元素时返回的默认值 如果不设置则会触发 StopIteration 异常
把类作为迭代器使用需要在类中实现两个魔法方法 __iter__() 与 __next__()
__iter__(self)
得到特殊的迭代器对象 实现__next__() 方法并通过 StopIteration 异常标识迭代完成
__next__()
返回下一个迭代器对象
StopIteration 异常用于标识迭代的完成 防止出现无限循环的情况
__next__() 方法中可以设置指定循环次数后触发 StopIteration 异常来结束迭代
10.生成器
生成器:使用 yield 的函数
生成器返回的是迭代器对象 只能用于迭代操作
调用生成器时 每次遇到 yield 时函数会暂停并保存当前运行信息 返回 yield 的值 下一次执行 next() 方法时从当前位置开始