继承乃面向对象的又一大特征,所谓继承就是子承父业。儿子继承父亲的家产,但是仅仅是父亲公共的东西。在面向对象中,继承就是一个类型继承另一个类型,当前类型就拥有另一个类型的公共属性和方法。达到代码的可重复使用,提高了代码的可扩充性。
继承的语法:
class 类名称(被继承类的名称):
pass
父类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
被继承的类称为父类,也称为基类和超类,继承父类的类被称为子类,也称为派生类。所有的类型都称为对象,所有的类型都是间接或者直接继承object类的。子类继承了父类的所有公共的属性和方法。
继承链
A继承B,B继承C,C继承D,这样就可以看出 A直接继承了B,间接继承了C,D;此时A创建的对象,可以同时使用B,C,D中所有公开的属 性和方法
多继承
python中,一个类型,可以同时继承多个类型,同时拥有所有继承类型的所有公开的属性和方法。多继承反映了生活中表现的的多个角色。
备注:在进行代码设计的过程中,可能会出现多继承,所以尽量不要在父类中定义相同名称的属性或者方法
备注2:如果父类中出现了相同名称的属性和方法,在使用的时候子类调用时会优先继承优先调用。使用类名称为.__mro__:查看属性/方法搜索顺序。尽量不要在多个类中出现名称相同的属性和方法。
方法重写:
子类在自己类中重新定义父类中已经存在的方法,在执行该方法时,如果子类中没有重写就直接调用父类的方法,如果子类重写了该方法,就直接调用子类重写的方法!重写体现了子类的独立性和可变性(多态)。
方法重写的条件:继承的关系,父类存在的方法,子类重新定义
子类中,访问父类的属性和方法:
class User(Person):
def __init__(self, name, age):
#直接通过父类的类名称调用父类的属性和方法
Person.__init__(name, age)
#通过super()来调用父类的属性和方法
super().__init__(name, age)
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
何时使用继承
假如我需要定义几个类,而类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义,这样只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性。
任何事情都有利有弊
继承的一个弱点就是,可能特殊的本类又有其他特殊的地方,又会定义一个类,其下也可能再定义类,这样就会造成继承的那条线越来越长,使用继承的话,任何一点小的变化也需要重新定义一个类,很容易引起类的爆炸式增长,产生一大堆有着细微不同的子类. 所以有个“多用组合少用继承”的原则