Python类的约束以及super()剖析
1.类的约束
第一版:
class WechatPay:def pay(self):print("微信支付")class AliPay:def pay(self):print("支付宝支付")class QQpay:def fuqian(self):print("QQ支付")wei = WechatPay()
ali = AliPay()
qq = QQpay()wei.pay()
ali.pay()
qq.fuqian()# 当统一接口时
def pay(object):object().pay() # QQ支付无法实现归一化
第二版:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class PayClass:def pay(self):passclass WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(QQpay) # QQpay会执行父类的pay方法但是无法完成支付
(1)对类的约束有两种:
<1> 提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.
<2> 使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.
第三版:
# 方式一: (推荐并且常用的方式)
# raise 主动抛出异常(主动报错)
class PayClass:def pay(self):raise Exception("你子类必须要写一个pay方法")class WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(QQpay) # QQpay类中没有pay方法,raise就会主动抛出异常(主动报错)# 方法二
# 抽象类,接口类: 制定一些规则
from abc import ABCMeta,abstractmethod # 抽象类,接口类
class PayClass(metaclass=ABCMeta): # 元类@abstractmethoddef pay(self):raise Exception("你子类必须要写一个pay方法")class WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(AliPay)
pay(QQpay) # QQpay类中没有pay方法,就会与指定的规则不符导致报错
总结:
约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:
使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的
使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)
2.super 剖析
super是严格按照类的继承顺序执行
class A:def f1(self):print('in A')class Foo(A):def f1(self):super().f1()print('in Foo')class Bar(A):def f1(self):print('in Bar')class Info(Foo,Bar):def f1(self):# super里的类名是指定查找mro中类名的下一个类, self是指定查找时使用的mro顺序super(Info,self).f1() # Foo() 对象的内存地址 # super(子类名,子类的mro列表)print('in Info f1')aa = Info() # 对象的内存地址
aa.f1()# Info [Info', Foo', Bar', A', 'object']a = Foo()
b = a
print(a)
print(b)print(Info.mro())
obj = Info()
obj.f1()
Python类的约束以及super()剖析相关推荐
- Python面向对象之六:类的约束和super函数
Python面向对象之六:类的约束和super函数 一.类的约束 类的约束就是对父类对子类的属性和方法进行一定的约束控制. 1.对子类属性的约束(slots) class A:__slots__ = ...
- python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...
第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...
- 封装,多态,类的约束,super()深入了解
python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...
- python类的应用_如何剖析python应用程序的类方法?
过去,我在同一文件中编写了具有所有功能的python代码,并且可以使用以下代码来分析我的程序: 这是我写的装饰器: def do_profile(cond): def resdec(f): if no ...
- python面向对象三大特性、类的约束、print带颜色输出及super补充
面向对象三大特性.类的约束.print带颜色输出及super补充 简述: python面向对象的三大特性: 1.继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为 ...
- 封装 多态 类的约束 super
python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- python类的继承super方法_Python类的继承super相关原理解析
看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最 ...
- 【转】python类中super()和__init__()的区别
[转]python类中super()和__init__()的区别 单继承时super()和__init__()实现的功能是类似的 class Base(object):def __init__(sel ...
最新文章
- vue启动时报错,node-modules下xxx缺失
- Introduction to the Trusted Services Project
- JZOJ 5353. 【NOIP2017提高A组模拟9.9】村通网
- Java100例题(一)
- GPU Pro2 - 3.Procedural Content Generation on the GPU
- python连接mysql查询一个数据_使用Connector / Python连接MySQL/查询数据
- 11 二叉查找树中搜索区间
- 故事感悟:管道与挑水
- hp打印机被识别为了usb大容量存储
- Android高能下载库FileDownloader
- 计算机图形学 期中大作业 俄罗斯方块
- Oracle根据生日计算年龄
- Python对遥感影像重采样,以及重采样方法
- tring_vector容器test
- 中国程序化购买广告解析:RTB/DSP/Ad Exchange/SSP/DMP,思维导图
- 想要申请PhD,真是路漫漫啊
- 设计模式——代理模式(附代码示例)
- pycharm配置python2.7.6环境_pycharm如何配置python环境
- SSM框架基于web的房屋租售管理系统源码+论文第二稿+软件环境+包安装调试
- Qt: QXMLStreamReader,读XML文件实例