今天我们来聊一聊Python中类的继承,本人将先给出一些基本格式,最后举一个栗子。若本文未特别提及,格式中缩进量均为一个Tab键,符号均为英文符号。
类的继承
由一个类编写另一个类的过程叫做类的继承。原来的类叫做父类或超类(superclass),新生成的类叫做子类。
首先来介绍单继承,即子类由一个父类派生。
基本格式:
class 子类名(父类名):
def __init__(self,参数)
super().__init__(参数)
子类属性
子类方法
注意:在Python3中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
super().__init__(参数)用来初始化父类的参数
对于多继承,其基本格式如下:
class 子类名(父类1,父类2,……):
def __init__(self,参数)
super().__init__(参数)
子类属性
子类方法
在子类的方法中可以调用父类的方法,有两种方法:
(1)父类名.方法名(self,参数)
(2)使用super()函数:
super().父类函数名(参数)
super(子类名,self).父类函数名(参数 )
说明:对于(1)调用父类的方法,若不加‘self’,在子类实例化时,Python不会将对象本身自动与参数捆绑起来,会显示缺少参数。对于(2),super()函数是用于调用父类(超类)中方法的一个函数,当只继承一个父类(不考虑object类,父类也只继承一个父类,父类的父类也只……)时,super()会一直回溯至最初的父类,这一点在子类改写父类方法时尤为明显;当子类继承多个父类时,继承顺序遵循MRO(Method Resolution Order,方法解析顺序表)算法,其原则是:父类永远出现在子类的后面(回溯),若存在多个父类,其之间的相对顺序保持不变。(具体可以参见:
官方说明:
The Python 2.3 Method Resolution Order
https://www.python.org/download/releases/2.3/mro/
Hom's Blog:
http://gohom.win/2016/02/23/py-super/
)
子类对父类方法的重写 在Python中,子类不仅可以创建新的方法,还可以重写父类中的方法。只需要在子类中定义一个与父类同名的方法即可,此时在子类中依然可以运用super()函数对父类中的重名方法进行调用。
最后是一个栗子:
# 创建父类Animal,有'name'和'color两项属性,计算数量的sumnumb()方法 class Animal: def __init__(self,color): self.name = 'Aa' self.color = color def sumnumb(self,numb): return numb**2 # 创建父类Pet,具有和Animal相似的属性与方法 class Pet: def __init__(self,color): self.name = 'Bb' self.color = color def sumnumb(self,numb): return (numb+1) # 创建子类Dog class Dog(Pet,Animal): #初始化父类属性color def __init__(self,color): super().__init__(color) # 重写父类sumnumb方法 def sumnumb(self): print(111) # 调用父类sumnumb方法 def func(self,numb): print(super().sumnumb(numb)) dog = Dog('black') dog.sumnumb() dog.func(1) print(dog.name)
运行结果为:
111
2
Bb
由上述结果可以看出,实例化Dog时,属性'name'和方法sumnumb都继承自父类Pet,由MRO的原则,这是符合预期的。当一个类继承自多个父类而父类又不继承自其它父类(object类除外)时,子类的继承顺序就和创建子类时所填写的父类顺序一致,即由左至右。但对于较为复杂的情况,如父类又继承自其它父类,则不一定按从左至右的顺序来继承,情况较为复杂。因此,在团队协作开发大型项目时不建议多继承。
本人在网上查找资料时也是感触颇深,有些博客作者内容潦草,凑数,难以获得想要学习的内容,本人将尽自己所能写好每一篇博客,也希望大家在创作和分享时能够认真负责。尽管如此,本人在Python上仍然属于初学者,难免有不及之处,欢迎大家批评指正。