继承inheritnce和派生derived
什么是继承/派生
派生就是从一个已有的类中衍生成新类
继承是指在衍生出的新类中的对象会拥有原类的属性和行为
作用:
用继承派生机制,可以将一些共有功能加在基类中,实现代码共享
在不改变基类代码的基础上,改变原有类的功能
名词:
基类(base class)/超类(super class)父类(father class)
派生类(derived class)/子类(child class)
单继承:
语法:
class 类名(基类名):
语句块
说明:
单继承是指派生类由一个基类衍生出来的类
class human:
def say(self,what):
print('say',what)
def walk(self,distance):
print('走了',distance,'公里')
class student(human): #(human)后加的
# def say(self,what):
# print('说',what)
# def walk(self,distance):
# print('走了',distance,'公里')
def study(self,subiect):
print('学习',subiect)
h1=human()
h1.say('天亮了')
h1.walk(5)
print('...............................')
s1=student()
s1.walk(4)
s1.say('感觉有点累')
s1.study('面向对象')
**继承说明:**
Python3中任何类都直接或间接地继承自object类
object类是一切类的超类
类的__base__属性
__base__属性用来记录此类的基类
python内建类的继承关系
>>>help(__butltins__)
覆盖override
覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实
例调用该方法时,实际调用的是子类的覆盖版本,这种现象叫做覆盖
作用:
实现和父类同名,但功能不同的方法
示例:
class A:
def work(self):
print('A.work被调用')
class B(A):
def work(self):
'''此方法会覆盖父类中同名的方法'''
print('B.work被调用')
b=B()
b.work()
**问题:**
当覆盖发生时,如何调用父类的被覆盖方法
此实例示意显示调用父类的显式方法:
class A: -\
def work(self): \
print('A.work被调用') \
class B(A): \
def work(self): \ 不推荐
'''此方法会覆盖父类中同名的方法''' / 使用
print('B.work被调用') /
pass /
b=B() /
#b.work() /
A.work(b) -/
super函数
super(cls,obj)返回绑定超类的实例(要求obj必须是cls类或者cls子类的对象)
super()返回绑定超类的实例,等同于:
super(__class__,实例方法的第一个参数),必须用在方法内调用
作用:
借助super()返回的实例间接调用父类的覆盖方法
示例:
class A:
def work(self):
print('A.work被调用')
class B(A):
def work(self):
'''此方法会覆盖父类中同名的方法'''
print('B.work被调用')
pass
b=B()
super(B,b).work()
super的应用
显示调用基类的初始化方法
当子类中实现了__init__方法,基类的__init__方法
将不会被自动调用。如果需要调用,则需要用super显式调用
class human:
def __init__(self,n,a):
print('__init__被调用' ,n,a)
self.name=n
self.age=a
#显式调用object类的__init__方法
super().__init__()
def infos(self):
print('姓名',self.name)
print('年龄',self.age)
class student(human):
def __init__(self,n,a,s=0):
super().__init__(n,a)
self.score=s
def infos(self):
super().infos()
print('成绩',self.score)
h1=student('小李',18)
# h1=human('小张', 20)
h1.infos()