Python:继承·派生·覆盖·super函数

继承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()

猜你喜欢

转载自blog.csdn.net/qq_43494793/article/details/83511018