Python的部分魔术方法(特殊方法或者双下划线方法)
__ len __
-
python内置类型(list, str, bytearray)在使用len()方法时:__ len __ 直接返回PyVarObject里的ob_size属性。
PyVarObject是表示内存长度可变的内置对象的C语言结构体
-
自定义对象类型直接调用 __ len __ 方法。
-
魔术方法的调用大部分是隐式的。
__ repr __ 和 __ str __
-
__ repr __ 是在交互模式下输入实例,按下回车自动调用。
__ str __ 是在调用print()或者str()函数时调用。
-
__ repr _ _ 和 __ str __ 二选一的时候最好用 __ repr __ ,因为找不到 __ str __方法时,会自动用 __ repr __ 代替。
__ add __
执行运算符 + 号时调用
__ mul __
执行运算符 * 号时调用
两个算数方法返回的值都是新创建的对象,被操作的两个值还是原封不动, 中缀运算符的基本原则就是不改变操作对象,而 是产出一个新的值。
__ bool __
尽管 Python 里有 bool 类型,但实际上任何对象都可以用于需要布尔值 的上下文中(比如 if 或 while 语句,或者 and、or 和 not 运算 符)。为了判定一个值 x 为真还是为假,Python 会调用 bool(x),这个 函数只能返回 True 或者 False。 默认情况下,我们自己定义的类的实例总被认为是真的,除非这个类对 __ bool __ 或者 __ len __ 函数有自己的实现。bool(x) 的背后是调用 x. __ bool __ () 的结果;如果不存在 __ bool __ 方法,那么 bool(x) 会尝试调用
x. _ _ len _ _ ()。若返回 0,则 bool 会返回 False;否则返回 True。
跟运算符无关的特殊方法
类别 | 方法名 |
---|---|
字符串 / 字节序列表示形式 | __ repr __ 、__ str __ 、 __ format __ 、 __ bytes __ |
数值转换 | __ abs __ 、 __ bool __ 、 _ complex __ 、_ int __ 、__ float __ 、__ hash __ 、__ index __ |
集合模拟 | __ len __ 、__ getitem __ 、__ setitem __ 、__ delitem __ 、__ contains__ |
迭代枚举 | __ iter __ 、__ reversed __ 、__ next__ |
可调用模拟 | __ call__ |
上下文管理 | __ enter__ 、__ exit__ |
实例创建和销毁 | __ new__ 、__ init__ 、__ del__ |
属性管理 | __ getattr __ 、__ getattribute__ 、__ setattr__ 、__ delattr __ 、__ dir__ |
属性描述符 | __ get__ 、__ set__ 、__ delete__ |
跟类相关的服务 | __ prepare __ 、__ instancecheck __ 、__ subclasscheck__ |
len不是普通方法