Python Magic Method

今天我们介绍一下 Python 的魔法方法。魔法方法指 object 类中被双下划线“__”包围的方法。之所以称它们为魔法方法,是因为它们的调用方式除了通过它们本身函数名外,还有额外的调用方法。

例如对于两个字符串 "Fu"、"Dan"来讲,想把他们拼接可以直接使用 "Fu" + "Dan",而在背后实际上调用的是 "__add__(self,other)"方法,即 "Fu".__add__( "Dan" )。

下面我们根据魔法方法的类别对它们进行一一介绍。(基于 Python3)

数学运算

主要包括加减乘除乘方等运算符,当作用于类时该怎样 behave。后面类似部分不再赘述。

位运算

一元运算

这里有些运算需要导入 math 包进行。

类型转化

Python3 中没有 long 转化,因为所有的 int 实际上存储的都是长整型。另外 Python3 转二进制、八进制和十六进制都是利用基准数(__index__)进行的,不再有对应单独的魔法方法了。

比较运算

特别注意小于(__lt__)运算符特别重要,因为所有的排序方法都依靠其来实现。

赋值运算

类型实例检查

有时候也叫反射(reflection)。

上面的魔法方法比较简单,有些和 C++ 中的运算符重载非常相像,下面介绍的就有些难度啦。

反射运算

也叫右运算。这是因为这些运算符是和右侧对象结合的。它们和普通的运算符(左运算符)相比较本质上是 self 和 other 交换了顺序,不过反射运算有一些特殊的地方以后单独讲一讲。

对象生命周期

一个对象一生的独白。看似蛮简单的,但是 new 和 init 的区别要注意,并且 del 要慎用,这个以后也讲一讲。

协程(coroutine)

Python 中的微线程,以后重点说一说。

类自身特征

表征类本身特性的一些方法。之后会撰文写一写其中有意思的方法。

可调用对象

类可以当作函数调用。这种真的只有一个魔法方法,单独拿出来是因为它重要,用的地方蛮多的,以后也讲一讲。

容器

实现一个容器必备,以后写个链表实践一下。

复制

这个涉及到对象内存表示,希望 go deep 的话 very important,之后详细说说。

属性访问控制

当你使用“.”的时候到底发生了什么,getattr和getattribute究竟有什么不同? 且听下回分解。

描述器对象

你了解 Descriptor 吗?有点像一个结构体,以后拿来讲一讲。

上下文管理

Tired of 异常处理、文件 close?来用上下文(with)吧!老写 with tf.Session as sess,之后我们来看看原理吧。

序列化

自定义对象怎么保存到硬盘?去了解一下 pickle 工作原理吧!

总结

本文介绍了 Python 中的魔法方法,并按照对象生命周期、位运算、数学运算、一元运算符、协程、类自身特征、可调用对象、类型转化、容器、复制、属性访问控制、描述器对象、上下文管理、比较运算、序列化、赋值运算符、类型实例检查、反射运算符这些类别对魔法方法进行了分类整理。之后立了好多个 flag,希望以后能把 Python 中一些复杂的东西讲清楚。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180124G0026200?refer=cp_1026

扫码关注云+社区