在python学习中,往往你会看到有的名称前面和后面都加上了双下划线,这种写法很特别,到底是什么意思呢? 在python 中由这些名字组成的集合所包含的方法就叫做魔法方法,也叫做特殊方法。今天我们就要讲一些重要的魔法方法,最重要的就是__init__方法。 当一个对象被创建以后,会立即调用构造方法。 创建构造方法:在python中创建一个构造方法很简单,只要把init方法的名字从简单的init修改为魔法版本__init__即可。 ![]() 一个例子学会所有内容。 代码讲解:定义了一个超类Bird,一个子类SongBird, 超类Bird定义了构造方法__init__是关于hungry特性的。在定义子类的时候构造方法被重写,但是新的构造方法没有任何关于hungry特性的代码。为了达到目的就得必须调用超类的构造方法。 def __init__(self): self.hungry=True def eat(self): if self.hungry: print ''Aaaah...'' self.hungry=False else: print ''No,thanks!'' class SongBird(Bird): self.sound=''Squawk!'' def sing(self): print self.sound >>> b=Bird() >>> sb=SongBird() >>> sb.sing() >>> sb.eat() Traceback (most recent call last): File '<pyshell#5>', line 1, in <module> File 'C:\Users\xdong\OneDrive - Micron Technology, Inc\python study\prictice\bird_hungry.py', line 6, in eat AttributeError: ''SongBird'' object has no attribute ''hungry'' 相信看了上个例子的小伙伴开始有疑问了,方法重写后,我应该怎么调用超类的构造方法呢? 我们现在要说两种情况教你怎么调用,说这个问题之前,我们先插点题外话,与其说是题外话倒不如说是知识扩展,我们先了解一下老式类和新式类的区别,这个需要看你的python的安装版本是多少,现在大部分都是3.0以上版本了,那么早在之前,以2.2版本为分割线,之前的版本是用的老师类,之后的用新式类。所以根据目前的发展情况,建议大家都用新式类,省的麻烦。 好了,话不多说,回归正题,我们就用老式类和新式类分别讲一下怎么可以直接调用上个例子中的超类Bird的构造方法。 ![]() 我们先说一下原理,方便你理解。 在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上,但是如果直接调用类的方法,那么就没有实例会被绑定,这样就可以自由地提供需要的self参数。其实这样子也被称为未绑定方法。 上例中,通过将当前的实例作为self参数提供给未绑定方法,SongBird就能够使用其他超类构造方法的所有实现,也就是说属性hungry能被设置。 一般情况下,调用超类的未绑定方法才是版本最好的选择。 既然说到这了,相信眼睛犀利的小伙伴们开始疑问了,那个super是什么东东?别着急,慢慢来! super函数:主要是应用在新式类。 序列和映射是对象的集合。为了实现它们基本行为,如果对象是不变的,那么久需要两个魔法方法,如果可变的就需要4个。 ![]() 如果创建一个无穷序列会发生什么?先上代码。 ![]() 代码解释: start=1,step=2 会得到(1,3,5,7,9,11......) self.start key*self.step s[4]=1 4*2=9 s[5]=1 5*2=11 |
|