1、继承、派生
什么是继承、派生
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
派生就是子类在继承父类的基础上衍生出新的属性。子类中独有的,父类中没有的;或子类定义与父类重名的东西。子类也叫派生类。
继承派生机制的作用
可以将一些共有功能加在基类中。实现代码的共享
在不改变基类的基础上改变原有的功能
继承说明
python3 任何类都直接或间接的继承自object类,object类是一切类的基类
2、单继承
语法:
class 类名(基类名):
语句块
说明:
单继承是派生类的一个基类衍生出的新类
示例
# 此示例示意单继承的定义方法和用法
class Human():
def say(self,str):
print(str)
def walk(self,distance):
print("走了",distance,'公里')
class student(Human):
def learn(self,subject):
print("正在学习",subject)
s1 = student()
s1.say("我要去学校")
s1.walk(10)
s1.learn("Python")
3、__base__属性
类的__base__属性用来记录此类的基类
>>> Human.__base__
<class 'object'>
>>> print(object.__base__)
None
4、覆盖
什么是覆盖
覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用方法时,实际调用的时子类中的覆盖版本。称这种现象为覆盖
5、super 函数
super(cls,obj) ,返回绑定超类的实例(要求obj必须为cls类型的实例)
super() ,返回绑定超类的实例,等同于:super(当前子类名,首参).方法。首参:实例方法的第一个参数。这种方式必须在方法内调用
作用
借助supper()返回的实例间接调用父类的覆盖方法
示例
# 此示例示意用super函数间接调用父类中覆盖的方法
class A():
def work(self):
print('A的work')
class B(A):
def work(self):
print("B的work")
def supper_work(self):
# 调用自己的work方法
self.work()
# 调用父类的wrok
super(B,self).work()
super(self.__class__,self).work()
super().work() # 这种方法必须在实例方法内部,不能再别的地方用
b = B()
B.work(b)
super(B,b).work()
b.supper_work()
显示调用基类的初始化方法
当子类中实现了__init__方法,基类的构造方法不会被调用,此时需要显示调用
示例
# 此示例示意显示调用初始化方法
class Human():
def __init__(self, n,a):
self.name = n
self.age = a
print("Human 类的初始化方法被调用...")
def infos(self):
print("name:",self.name)
print("age:",self.age)
class Student(Human):
def __init__(self,n,a,s=0):
super(Student,self).__init__(n,a)
self.score = s
print("Student类的初始化方法被调用...")
def infos(self):
super(Student,self).infos() # 调用父类的方法
print("score:",self.score)
s1 = Student('张飞',15,80)
s1.infos()
6、多继承
语法:
class 类名(基类名1,基类名2,……):
说明
一个子类同时继承自多个父类,父类中的方法可以同时被继承下来
如果父类中有同名的方法,而子类中有没有覆盖此方法时,调用结果难以确定
示例
class Car:
def run(self,speed):
print("汽车以",speed,"km/h的速度行驶")
class Plane:
def fly(self,height):
print("飞机在海拔",height,"米的高度飞行")
class PlaneCar(Car,Plane):
'''同时拥有Car 和 Plane 的方法'''
p1 = PlaneCar()
p1.fly(10000) # 飞机在海拔10000米的高度飞行
p1.run(100) # 汽车以每小时100km/h的速度行驶
注意
多继承有标识符冲突问题,要谨慎使用多继承。在标识符冲突的时候,先继承谁就执行谁的。但是继承的越多,冲突问题就越大,程序就越不稳定。
7、多继承的 MRO(Method Resolution Order)问题
类的 mro 属性作用:用来记录类的方法查找顺序
super() 函数就是根据 mro 来调用上层的方法的
class A:
def go(self):
print("A")
class B(A):
def go(self):
print("B")
super().go()
class C(A):
def go(self):
print("C")
super().go()
class D(B,C):
def go(self):
print("D")
super().go()
d = D()
d.go()
输出(先继承谁,就先找谁)
D
B
C
A