在v站@ltoddy上看到一篇关于Python魔法方法的总结,记录下。
基础
如果你想… | 所以,你写… | Python调用… |
---|---|---|
初始化一个实例 | x = MyClass() |
x.__init__() |
作为一个字符串的"官方"表示 | repr(x) |
x.__repr__() |
作为一个字符串 | str(x) |
x.__str__() |
作为字节数组 | bytes(x) |
x.__bytes__() |
作为格式化字符串 | format(x, format_spec) |
x.__format__(format_spec) |
__init__()
方法在创建实例后调用.如果你想控制创建过程,请使用__new__()
方法- 按照惯例,
__repr__()
应该返回一个有效的Python表达式的字符串 __str__()
方法也被称为你的print(x)
迭代相关
如果你想… | 所以,你写… | Python调用… |
---|---|---|
遍历一个序列 | iter(seq) |
seq.__iter__() |
从迭代器中获取下一个值 | next(seq) |
seq.__next__() |
以相反的顺序创建一个迭代器 | reversed(seq) |
seq.__reversed__() |
__iter__()
无论何时创建新的迭代器,都会调用该方法.__next__()
每当你从迭代器中检索一下个值的时候,都会调用该方法__reversed__()
方法并不常见.它需要一个现有序列并返回一个迭代器,该序列是倒序的顺序.
属性
如果你想… | 所以,你写… | Python调用… |
---|---|---|
得到一个属性 | x.my_property |
x.__getattribute__('my_property') |
获得一个属性 | x.my_property |
x.__getattr__('my_property') |
设置一个属性 | x.my_property = value |
x.__setattr__('my_property', value) |
删除一个属性 | del x.my_property |
x.__delattr__('my_property') |
列出所有属性和方法 | dir(x) |
x.__dir__() |
- 如果你的类定义了一个
__getattribute__()
方法,Python将在每次引用任何属性或方法名时调用它. - 如果你的类定义了一个
__getattr__()
方法,Python只会在所有普通地方查找属性后调用它.如果一个实例x
定义了一个属性color
,x.color
将不会调用x.__getattr__('color')
; 它将简单地返回已经定义的x.color
值. __setattr__()
只要你为属性指定值,就会调用该方法.__delattr__()
只要删除属性,就会调用该方法.__dir__()
如果您定义一个__getattr__()
或者__getattribute__()
方法,该方法很有用.通常情况下,调用dir(x)
只会列出常规属性和方法.
__getattr__()