继承
什么是继承:继承是新建类的一种方式,通过此方式生成的类称为子类、或者 派生类,被继承的类称为父类、基类或超类。在python中,一个子类可以继承多个父类。
继承的作用:减少代码的冗余,提高开发效率。
如何实现继承:在定义类的基础上,在类名后加上(父类名)。 class Teacher(Human): ----------->Teacher类继承自Human类
类似于类和对象谁先有的关系,父类和子类的关系也类似。先在子类中抽象出父类,再改写子类进行继承。
在有继承关系的类中,实例化出的对象在查找相关属性时,会先在对象的名称空间中找,再到子类的名称空间中找,最后到父类的名称空间中找,若全部都找不到,就会报错。
派生
子类继承父类的属性与方法,并派生出属于自己的属性与方法。
如果子类中的方法名与父类中的重名,会优先使用子类的。相当于其他语言中的重写。
派生的两种实现方式:特别强调,在编程时,务必二选一,严禁混用
1、指名道姓式
# _*_ coding: gbk _*_ # @Author: Wonder class Human: def __init__(self, name, age): self.name = name self.age = age class Teacher(Human): def __init__(self, name, age, gender): Human.__init__(self, name, age) self.gender = gender teacher1 = Teacher('abc', 19, 'male') print(teacher1.name, teacher1.age, teacher1.gender) # abc 19 male
2、super ( ) 方法
# _*_ coding: gbk _*_ # @Author: Wonder class Human: def __init__(self, name, age): self.name = name self.age = age class Student(Human): def __init__(self, name, age, hobby): super().__init__(name, age) self.hobby = hobby student1 = Student('Henry', 18, 'swimming') print(student1.name, student1.age, student1.hobby) # Henry 18 swimming
经典类与新式类
在python2中,如果没有明确标明是object的子类,都属于经典类。
在python3中,无论有没有标明是object的子类,全部都是新式类,可以理解为全部继承自object类。
在多继承的情况下,会将查找顺序写入mro列表中,
经典类的查找顺序:深度优先,一开始就刨根问底,此处的底一定不可以是object的子类。
新式类的查找顺序:广度优先,全部遍历完之后,最后触底object,python3中底可以不做任何申明,但python2中一定要声明object才可以当成新式类处理。
新式类提供了方法 .mro方法查看查找序列。super()方法是严格按照mro序列进行查找的,特别注意,有个广度优先原则在里面。