继承

#继承:
#面向对象的三大特性:继承、封装、多态
#python中类的继承分为:单继承和多继承
#子类继承了父类的所有属性,子类自定义的属性如果与父类重名不会覆盖父类的属性,会先从子类中找

#什么时候用继承:
#当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
#当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承

'''
#例如:
class P1:
pass
class P2:
pass
class Su1(P1 ): #单继承,继承了p1
pass
class Su2(P1 ,P2) #多继承,同时继承了p1p1
pass
'''
#实例:
class Father:
age = 40
def __init__(self,name):
self.name= name
def f(self):
print('%s给了儿子钱'%self.name)

class Son(Father):
age = 16
print('son')

s1 = Son('alex') #son类继承了Father
print(s1.name)
s1.f() #可以调用Father下的方法

#son类和father类有重名属性age,但是son类的属性不会覆盖father类属性,会先从子类中找
print('这是子类的属性————>',s1.age)
print('这是父类的属性————>',Father.age)


#接口继承:
  #接口继承实质上是:“要求做出一个抽象,这个抽象规定了一个兼容接口,使得外部调用者无需了解具体细节,
可一视同仁的处理实现了特定接口的所有对象。这种在程序设计上称之为归一化。
  #接口继承就是在基类中定义子类要实现的方法名称(使用@abc.abstractmethod来装饰该函数,但它并未无
实际功能),继承它的子类必须要自定义这个函数功能,若子类没有该函数,则开始实例化就会报错。
  #用途:某些类要实现相同名称但功能不同的函数时,就可以先定义一个父类,再在子类中定义必须要实现的
功能。这样子类在继承父类时,就可以避免忘记必须要实现的功能函数了,它是用来规范子类的方法。实际上基类不
用进行实例化操作,因为它完全没有意义。
  # 子类必须实现读写功能

#实例:
import abc
class All_file(metaclass = abc.ABCMeta ):#父类定义了读写功能的接口
@abc.abstractmethod
def read(self):
pass
@abc.abstractmethod
def write(self):
pass

class Text_1(All_file ): #Txt_1()继承了All_file(),子类必须实现读写功能
def read(self):
print('text_1--->read')
def write(self):
print('text_1--->write')

class Text_2(All_file ): #Txt_2()继承了All_file(),子类必须实现读写功能
def read(self):
print('text_2--->read')
def write(self):
print('text_2--->write')

s1 = Text_1 () #实例化
s2 = Text_2()
s1.read()
s1.write()
s2.read()
s2.write()
print('------------end----------')

#继承顺序——mro线性顺序列表
#实例:
class A:
def test(self):
print('A')
class B(A):
def test(self):
print('B')
class C(A):
def test(self):
print('C')
class D(B):
def test(self):
print('D')
class E(C):
def test(self):
print('E')
class F(D,E):
def test(self):
print('F')

f1 = F() #实例化
f1.test() #按照F->D->B->E->C->A顺序继承
print(F.__mro__) #__mro__调出继承顺序
print('----------end---------')


#在子类中如何调用父类的方法
#如下实例:
#方法1
class School:
def __init__(self,name,addr):
self.name = name
self.addr = addr
def teacher(self):
print('这是来自父类的方法',self.name,self.addr)

class Stu(School):
def __init__(self,name,addr,sname): #注意点1
School.__init__(self,name,addr) #注意点2
self.sname = sname
def run(self):
School.teacher(self) #注意点3
print('%s正在%s的操场跑步'%(self.sname,self.name))
s1 = Stu('清华','北京','alex')
s1.run()

#方法2——super()的使用
class School:
def __init__(self,name,addr):
self.name = name
self.addr = addr
def teacher(self):
print('这是来自父类的方法',self.name,self.addr)

class Stu(School):
def __init__(self,name,addr,sname): #注意点1
super().__init__(name,addr) #注意点2
self.sname = sname
def run(self):
super().teacher() #注意点3
print('%s正在%s的操场跑步'%(self.sname,self.name))
s2 = Stu('北京大学','北京','alex')
s2.run()
原文地址:https://www.cnblogs.com/shadowfolk/p/14655545.html