文章目录
0.摘要
在本书其它几处,我们已经见识过一些特殊方法——即在使用某些语法时 P y t h o n Python Python 所调用的“神奇”方法。使用特殊方法,类用起来如同序列、字典、函数、迭代器,或甚至像个数字!本附录为我们已经见过特殊方法提供了参考,并对一些更加深奥的特殊方法进行了简要介绍。
1.基础知识
- 对 _ _ i n i t _ _ ( ) \_\_init\_\_() __init__() 方法的调用发生在实例被创建之后。如果要控制实际创建进程,请使用 _ _ n e w _ _ ( ) \_\_new\_\_() __new__() 方法。
- 按照约定, _ _ r e p r _ _ ( ) \_\_repr\_\_() __repr__() 方法所返回的字符串为合法的 P y t h o n Python Python 表达式。
- 在调用 p r i n t ( x ) print(x) print(x) 的同时也调用了 _ _ s t r _ _ ( ) \_\_str\_\_() __str__()方法。
- 由于 b y t e s bytes bytes 类型的引入而从 P y t h o n 3 Python 3 Python3 开始出现。
- 按照约定, f o r m a t _ s p e c format\_spec format_spec 应当遵循相关的规范。
在此多提一下 r e p r repr repr的用法:
2.行为方式与迭代器类似的类
在《迭代器》一章中,我们已经学习了如何使用 _ _ i t e r _ _ ( ) \_\_iter\_\_() __iter__() 和 _ _ n e x t _ _ ( ) \_\_next\_\_() __next__() 方法从零开始创建迭代器。
- 无论何时创建迭代器都将调用 _ _ i t e r _ _ ( ) \_\_iter\_\_() __iter__() 方法。这是用初始值对迭代器进行初始化的绝佳之处。
- 无论何时从迭代器中获取下一个值都将调用 _ _ n e x t _ _ ( ) \_\_next\_\_() __next__() 方法。
- _ _ r e v e r s e d _ _ ( ) \_\_reversed\_\_() __reversed__() 方法并不常用。它以一个现有序列为参数,并将该序列中所有元素从尾到头以逆序排列生成一个新的迭代器。
P y t h o n 3 Python 3 Python3 将会调用 s e q . _ _ i t e r _ _ ( ) seq.\_\_iter\_\_() seq.__iter__() 以创建一个迭代器,然后对迭代器调用 _ _ n e x t _ _ ( ) \_\_next\_\_() __next__() 方法以获取 x x x 的每个值。当 _ _ n e x t _ _ ( ) \_\_next\_\_() __next__() 方法引发 S t o p I t e r a t i o n StopIteration StopIteration 例外时, f o r for for 循环正常结束。
3.计算属性
- 如果某个类定义了 _ _ g e t a t t r i b u t e _ _ ( ) \_\_getattribute\_\_() __getattribute__() 方法,在每次引用属性或方法名称时 P y t h o n Python Python都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。
- 如果某个类定义了 _ _ g e t a t t r _ _ ( ) \_\_getattr\_\_() __getattr__() 方法, P y t h o n Python Python 在访问不存在的属性时会调用它。如果实例 x x x 定义了属性 c o l o r color color, x . c o l o r x.color x.color 将不会调用 x . _ _ g e t a t t r _ _ ( ′ c o l o r ′ ) x.\_\_getattr\_\_('color') x.__getattr__(′color′);而只会返回 x . c o l o r x.color x.color 已定义好的值。
- 无论何时给属性赋值,都会调用 _ _ s e t a t t r _ _ ( ) \_\_setattr\_\_() __setattr__() 方法。
- 无论何时删除一个属性,都将调用 _ _ d e l a t t r _ _ ( ) \_\_delattr\_\_() __delattr__() 方法。
- 如果定义了 _ _ g e t a t t r _ _ ( ) \_\_getattr\_\_() __getattr__() 或 _ _ g e t a t t r i b u t e _ _ ( ) \_\_getattribute\_\_() __getattr