在Python中,有的名称会在前面和后面加上两个下划线,这种写法其实有着特殊的含义。一般不要在自己的程序中使用这种名字
在Python中由这些前后带下划线的名字组成的集合所包含的方法成为魔法方法。
如果你的对象实现了这些方法中的某一个,那么这个方法会在特殊情况下被Python调用,几乎没有直接调用它的必要
其实我们之前学习的大杀器之迭代器和生成器的能力也是来源于定义的魔法方法哦!
一、构造方法 init()
构造方法实例
调用代码:a = ClassA();
输出: this is ClassA init method
当然,我们的构造函数也是可以带参数的哦
调用代码:a = ClassA(“hello”);
输出:
二、重写一般方法
每个类都可以有多个超类,如果你调用了一个B类的方法,而B类中并不存在该方法,但是B类是继承A类的,那么就会去A类中查找是否存在该方法
调用代码如下:
结果输出如下:
可以看到,类B没有定义say方法,其调用的是父类ClassA的say方法。
当然,ClassB 可以重写ClassA的say方法
调用代码如下:
结果输出如下:
三、重写构造方法
从上面的例子我们可以看到,ClassB继承ClassA,ClassB也有自己的构造函数,但是其并没有调用ClassA的构造函数。这样子会造成什么问题呢?
调用代码如下:
结果输出如下:
可以看到,由于ClassB没有调用ClassA的构造函数,但是name属性没有创建。
通过未绑定形式进行调用(python2和python3适用)
绑定:在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上。
那么我们如果调用未绑定的方法呢?通过类来直接调用方法其实就可以实现了,因为我们的类并未被实例化,也就不存在self,但是我们在调用类方法时,传入当前实例的self,也就可以实现我们的目的了。如在ClassB的构造函数中调用ClassA的构造方法,传入ClassB实例的self。
调用代码如下:
输出如下(在ClassA的构造函数中输出当前self是什么类型):
使用supper函数
示例代码如下:
代码调用如下:
结果输出如下:
可以看到,两种实现的效果是一样的。
Ok,魔方方法当然不止这么点,我们将分多篇进行学习
小伙伴们有什么好的建议都可以给我留言哦!
如果看到了这里,说明你已经看完了,感谢你的支持
喜欢就点一下哦,不喜欢可以留言指出不足哦!谢谢!