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()剖析相关推荐

  1. Python面向对象之六:类的约束和super函数

    Python面向对象之六:类的约束和super函数 一.类的约束 类的约束就是对父类对子类的属性和方法进行一定的约束控制. 1.对子类属性的约束(slots) class A:__slots__ = ...

  2. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

  3. 封装,多态,类的约束,super()深入了解

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  4. python类的应用_如何剖析python应用程序的类方法?

    过去,我在同一文件中编写了具有所有功能的python代码,并且可以使用以下代码来分析我的程序: 这是我写的装饰器: def do_profile(cond): def resdec(f): if no ...

  5. python面向对象三大特性、类的约束、print带颜色输出及super补充

    面向对象三大特性.类的约束.print带颜色输出及super补充 简述: python面向对象的三大特性: 1.继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为 ...

  6. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  7. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  8. python类的继承super方法_Python类的继承super相关原理解析

    看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最 ...

  9. 【转】python类中super()和__init__()的区别

    [转]python类中super()和__init__()的区别 单继承时super()和__init__()实现的功能是类似的 class Base(object):def __init__(sel ...

最新文章

  1. vue启动时报错,node-modules下xxx缺失
  2. Introduction to the Trusted Services Project
  3. JZOJ 5353. 【NOIP2017提高A组模拟9.9】村通网
  4. Java100例题(一)
  5. GPU Pro2 - 3.Procedural Content Generation on the GPU
  6. python连接mysql查询一个数据_使用Connector / Python连接MySQL/查询数据
  7. 11 二叉查找树中搜索区间
  8. 故事感悟:管道与挑水
  9. hp打印机被识别为了usb大容量存储
  10. Android高能下载库FileDownloader
  11. 计算机图形学 期中大作业 俄罗斯方块
  12. Oracle根据生日计算年龄
  13. Python对遥感影像重采样,以及重采样方法
  14. tring_vector容器test
  15. 中国程序化购买广告解析:RTB/DSP/Ad Exchange/SSP/DMP,思维导图
  16. 想要申请PhD,真是路漫漫啊
  17. 设计模式——代理模式(附代码示例)
  18. pycharm配置python2.7.6环境_pycharm如何配置python环境
  19. SSM框架基于web的房屋租售管理系统源码+论文第二稿+软件环境+包安装调试
  20. Qt: QXMLStreamReader,读XML文件实例

热门文章

  1. 基于订阅的服务通讯架构体系
  2. 终身学习这件事,比你想的还要重要
  3. Silverlight 5 RC新特性探索系列:13.Silverlight 5 RC 新增对并行任务库(TPL)的支持
  4. 怎样得到select所有option里的值
  5. 【ABAP】SAP销售订单定价值变更
  6. minisap的安装
  7. 2014款新宝来车引擎盖开关在哪里
  8. sap转换成基本订单单位
  9. Idoc学习笔记----获取查询Idoc信息
  10. 中国34城最全剖析:深圳、天津的短板与不足,何时才能补?