---恢复内容开始---
- 继承(简单的面试题)
- 抽象类(重要)
- 接口类(主要是python和java的区别)
- 多继承(c3算法和__mro__)
一 继承(简单的面试题)
class Base: def __init__(self): self.func() def func(self): print('in base')class Son: def func(self): print('in son')s= Son()# print(s.func())# print(s) #按题意思看: 结果是不打印任何东西,因为自己没有调用任何方法.想要打印让下面类继承上面类
修改后:
# 继承的面试题class Base: def __init__(self): self.func() def func(self): print('in base')class Son(Base): def func(self): super().func() print('in son')s= Son()print(s.func()) print(s) 打印结果:
in base
in sonin basein sonNone二 抽象类
# 抽象类:是规范下面子类中某些方法用的,必须要有继承关系# 具体例子from abc import ABCMeta,abstractmethod #(抽象方法)class Pyment(metaclass=ABCMeta): # metaclass=ABCMeta表示类pyment是一个规范类 @abstractmethod # 表示下面一行中的pay方法是一个必须在子类中实现的方法(下面的方法名字必须子类中的一样) def pay(self): pass # 可以不用写东西class WeChatPay(Pyment): def __init__(self,name): self.name=name def pay(self,money): print('%s通过微信消费了%s元'% (self.name,money))class AliPay(Pyment): def __init__(self,name): self.name = name def pay(self,money): # 支付宝提供了一个网络上的联系渠道 print('%s通过支付宝消费了%s元'%(self.name,money))class ApplePay(Pyment): def __init__(self,name): self.name = name def pay(self,money): print('%s通过苹果支付消费了%s元'%(self.name,money))# 归一化设计:也就是把实例化,传参放到一个函数里,def pay_func(person,payway,money): if payway == 'alipay': per = AliPay(person) elif payway == 'wechatpay': per = WeChatPay(person) elif payway == 'ApplePay': per = ApplePay(person) per.pay(money)pay_func('alex','alipay',200) # 从下面直接给函数传参数 然函数去做判断 然后去实例化一个对象a=Pyment()# 错的.抽象类是不能实例化的 # 规定: Pyment# 就是一个规范类, 这个类存在的意义不在于实现实际的功能, 而是为了约束所有的子类必须实现pay的方法# 抽象类的特点:# 必须在类定义的时候指定metaclass = ABCMeta# 必须在要约束的方法上方加上@abstractmethod方法
三 接口类:
python # 抽象类 : 抽象类中的方法可以写一些具体的py代码(规范) # 单继承 # 多继承 # java # 不支持多继承,新的概念 接口 Interface # 和抽象类几乎一模一样的功能 : # 只定义一个接口名字(基类名),内部定义子类必须实现的方法 # 接口支持多继承 # 接口内部的所有方法都不能写具体的代码,只能用pass代替 # 抽象类 : # 单继承的形容,并且在单继承中可以在方法中写python代码 # 接口类 : 更接近java中的接口的概念 # python中由于有了抽象类的多继承,不需要接口的概念了 # 一个基类写出来被子类多继承了 : 接口类 # 并且在方法中只写pass(你可以选择性的满足)
四 多继承(c3算法和__mro__)
例子 :
# 首先class A: pass def func(self):print('A')class B(A): pass def func(self):print('B')class C(A): pass def func(self): print('C')class D(B): pass def func(self): print('D')class E(C): pass def func(self):print('E')class F(D,E): pass # def func(self):print('F')f= F()print(f.func())print(F.__mro__) # python2 :两种类# python3 :只有一种类 # 新式类 : 默认继承object类 # object 是所有类的父类 # 为什么可以不写__init__? # 所有object中的类都是你自己不写也可以调用的# 区别# 钻石继承问题/多继承的优先级问题# 在python3中 所有的类都是新式类,所有的新式类的继承顺序都遵循C3算法,也叫广度优先算法# 可以使用类名.__mro__()这个方法来查看这个继承顺序# super 在多继承中执行顺序也遵循C3算法
例子二 :
class A: def func(self):print('A')class B(A): def func(self): super().func() print('B')class C(A): def func(self): super().func() print('C')class D(B,C): def func(self): super().func() print('D')b = D()print(b.func())
A
CBDNone
---恢复内容结束---