面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
继承语法
class 子类类名(父类1):
类体
Python支持多重继承,一个子类可以继承多个父类,继承语法如下:
class 子类类名(父类1,父类2,…):
类体
(一个子类从多个父类派生,而子类又没有自己的构造函数时按顺序继承,哪个父类在最前面且它又有自己的构造函数,就继承它的构造函数,如果最前面第一个父类没有构造函数,则继承第2个的构造函数,第2个没有的话,再往后找,以此类推。)
(不接受第二个父类构造方法中的grade)
继承
1、如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法。
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数。
3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
如果父类方法不能满足子类需求,那么我们就要在子类中重写父类中的方法。重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
通常我们约定,两个下划线开头的属性是私有属性(private),其他为公共(public),类内部可以访问私有属性,不能在类的外部被使用或直接访问。类外部可以通过"_类名_私有属性名"访问私有属性。
外部调用时:对象名._类名__私有属性名
私有方法与私有属性类似,方法本质上也是属性,只不过是可以通过()执行而已。
外部调用时:对象名._类名__私有方法名
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似__init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于。
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。