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
Python魔法方法详解
本文深入解析Python中的魔法方法,包括构造方法、算术运算、属性访问等,详细介绍了如何通过魔法方法实现类的定制,增强Python编程技能。
1447

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



