#继承:
#面向对象的三大特性:继承、封装、多态
#python中类的继承分为:单继承和多继承
#子类继承了父类的所有属性,子类自定义的属性如果与父类重名不会覆盖父类的属性,会先从子类中找
#什么时候用继承:
#当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
#当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承
'''
#例如:
class P1:
pass
class P2:
pass
class Su1(P1 ): #单继承,继承了p1类
pass
class Su2(P1 ,P2) #多继承,同时继承了p1和p1类
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---------')