面向对象进阶
Posted systemsystem
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象进阶相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
- 继承(简单的面试题)
- 抽象类(重要)
- 接口类(主要是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 son
in base
in son
None
二 抽象类
# 抽象类:是规范下面子类中某些方法用的,必须要有继承关系 # 具体例子 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
C
B
D
None
---恢复内容结束---
以上是关于面向对象进阶的主要内容,如果未能解决你的问题,请参考以下文章