Python Task 11:魔法方法
- 魔方方法或者又称为特殊方法,是指被包含下划线的方法或者所能调用到的方法的统称,这些通常会在特殊的情况下调用,并且基本没有手动调用他们的必要。
1.构造方法
- 构造方法就是类似于init的初始化方法,差别在于一个对象被构建好以后会自动调用构造方法。
2.算术运算
算术运算符 | 描述 |
---|---|
add(self, other) | 定义加法的行为:+ |
sub(self, other) | 定义减法的行为:- |
mul(self, other) | 定义乘法的行为:* |
truediv(self, other) | 定义真除法的行为:/ |
floordiv(self, other) | 定义整数除法的行为:// |
mod(self, other) | 定义取模算法的行为:% |
divmod(self, other) | 定义当被 divmod() 调用时的行为 |
pow(self, other[, modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
lshift(self, other) | 定义按位左移位的行为:<< |
rshift(self, other) | 定义按位右移位的行为:>> |
and(self, other) | 定义按位与操作的行为:& |
xor(self, other) | 定义按位异或操作的行为:^ |
or(self, other) | 定义按位或操作的行为:l |
反运算 | 描述 |
---|---|
radd(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rsub(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rmul(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rtruediv(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rfloordiv(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rmod(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rdivmod(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rpow(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rlshift(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rrshift(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
rxor(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
ror(self, other) | 当被运算对象(左边的操作对象)不支持该运算时被调用 |
3.简单定制
4.属性访问
语句 | 描述 |
---|---|
getattr(self, name) | 定义当用户试图获取一个不存在的属性时的行为。 |
getattribute(self, name) | 定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用__getattr__) |
setattr(self, name, value) | 定义当一个属性被设置时的行为。 |
delattr(self, name) | 定义当一个属性被删除时的行为。 |
5.描述符
- 描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
语句 | 描述 |
---|---|
get(self, instance, owner) | 用于访问属性,它返回属性的值。 |
set(self, instance, value) | 将在属性分配操作中调用,不返回任何内容。 |
del(self, instance) | 控制删除操作,不返回任何内容。 |
6.定制序列
- 如果说你希望定制的容器是不可变的话,你只需要定义__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]。
7.迭代器
-
迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
-
迭代器是一个可以记住遍历的位置的对象。
-
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
-
迭代器只能往前不会后退。
-
字符串,列表或元组对象都可用于创建迭代器
-
迭代器有两个基本的方法:iter() 和 next()。
语句 | 描述 |
---|---|
iter(object) 函数 | 用来生成迭代器 |
next(iterator[, default]) | 返回迭代器的下一个项目 |
iterator | 可迭代对象 |
default | 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常 |
把一个类作为一个迭代器使用需要在类中实现两个魔法方法 iter() 与 next() 。
- iter(self)定义当迭代容器中的元素的行为,返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next()__方法并通过 StopIteration 异常标识迭代的完成。
- next() 返回下一个迭代器对象。
- StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next()__方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
8.生成器
- 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
- 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
- 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行
next() 方法时从当前位置继续运行。 - 调用一个生成器函数,返回的是一个迭代器对象。
9.推导式 - 列表推导式
- 字典推导式
- 集合推导式
10.增量赋值运算符
语句 | 描述 |
---|---|
iadd(self, other) | 定义赋值加法的行为:+= |
isub(self, other) | 定义赋值减法的行为:-= |
imul(self, other) | 定义赋值乘法的行为:*= |
itruediv(self, other) | 定义赋值真除法的行为:/= |
ifloordiv(self, other) | 定义赋值整数除法的行为://= |
imod(self, other) | 定义赋值取模算法的行为:%= |
ipow(self, other[, modulo]) | 定义赋值幂运算的行为:**= |
ilshift(self, other) | 定义赋值按位左移位的行为:<<= |
irshift(self, other) | 定义赋值按位右移位的行为:>>= |
iand(self, other) | 定义赋值按位与操作的行为:&= |
ixor(self, other) | 定义赋值按位异或操作的行为:^= |
ior(self, other) | 定义赋值按位或操作的行为: |
11.一元操作符
语句 | 描述 |
---|---|
neg(self) | 定义正号的行为:+x |
pos(self) | 定义负号的行为:-x |
abs(self) | 定义当被 abs() 调用时的行为 |
invert(self) | 定义按位求反的行为:~x |
12.类型转换
语句 | 描述 |
---|---|
complex(self) | 定义当被 complex() 调用时的行为(需要返回恰当的值) |
int(self) | 定义当被 int() 调用时的行为(需要返回恰当的值) |
float(self) | 定义当被 float() 调用时的行为(需要返回恰当的值) |
round(self[, n]) | 定义当被 round() 调用时的行为(需要返回恰当的值) |
index(self) | 1. 当对象是被应用在切片表达式中时,实现整形强制转换 2.如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index 3.如果 index 被定义,则 int 也需要被定义,且返回相同的值 |
参考来源:
https://blog.youkuaiyun.com/qq_38520096/article/details/79237593
https://mp.weixin.qq.com/s/y5cTjzMHqS4xMEUrUEiV_g
https://www.jianshu.com/p/d5d79762ce7e