面向对象三大特性:封装,继承,多态
人总结:
1、封装,即将代码块抽出来封装成类或者函数,从而提高复用性
2、继承,即子类继承父类的类属性和方法,包括类变量、类方法、静态方法、实例方法。当子类对象执行的内容没有时用父类的。python中支持多继承,父类私有的属性不会被继承
——这里要重点提一下:继承同样适用于__init__(),new()等自动执行的魔法方法。比如子类创建实例对象时,首先会在子类中找new方法执行,new执行成功并返回对象后再找init方法执行,如果子类中没有new方法和init方法则调用父类中的new和init方法
3、多态,即一个对象具有多种形态,一般来说发生在继承关系上,体现在应用上主要是当需要一个某个类的对象时可以传一个该类的子类对象过去,既他的子类可以“充当“它父类的角色。但同时python又是一种弱类型的语言,因此多态可以发生在没有继承关系的基础上就是所谓的鸭子类型,只是在调用关系上满足,而并没有继承关系
举个栗子:子类B中无new、init方法,则都是调用父类中的new、init方法
class A():
...: def __new__(cls,*args,**kwargs):
...: print(" A new method is running!--")
...: return object.__new__(cls)
...: def __init__(self,*args):
...: print("A init method is running")
...:
...:
In [89]: class B(A):
...: def bb(self):
...: print("B bb method is running")
a = A()
A new method is running!--
A init method is running
In [91]: b = B()
A new method is running!--
A init method is running
In [92]: isinstance(b,B)
Out[92]: True
In [93]: isinstance(b,A)
Out[93]: True
In [94]: isinstance(a,B)
Out[94]: False
In [95]: b.bb()
B bb method is running
B子类中有init方法,则调用子类自己的init方法
class B(A):
...: def bb(self):
...: print("B bb method is running")
...: def __init__(self):
...: print("B init method is running!")
...:
In [98]: b = B()
A new method is running!--
B init method is running!