⾸先, 你要清楚. 约束是对类的约束.

用一个例子说话:

公司让小明给他们的网站完善一个支付功能,小明写了两个类,如下:

  1. class QQpay:
  2. def pay(self,money):
  3. print('使用qq支付%s元' % money)
  4.  
  5. class Alipay:
  6. def pay(self,money):
  7. print('使用阿里支付%s元' % money)
  8.  
  9. a = Alipay()
  10. a.pay(100)
  11.  
  12. b = QQpay()
  13. b.pay(200)

但是上面这样写不太放方便,也不合理,老大说让他整改,统一一下付款的方式,小明开始加班整理:

  1. class QQpay:
  2. def pay(self,money):
  3. print('使用qq支付%s元' % money)
  4.  
  5. class Alipay:
  6. def pay(self,money):
  7. print('使用阿里支付%s元' % money)
  8.  
  9. def pay(obj,money): # 这个函数就是统一支付规则,这个叫做: 归一化设计。
  10. obj.pay(money)
  11.  
  12. a = Alipay()
  13. b = QQpay()
  14.  
  15. pay(a,100)
  16. pay(b,200)

写了半年的接口,小明终于接了大项目了,结果公司没品位,招了一个野生的程序员春哥接替小明的工作,老大给春哥安排了任务,让他写一个微信支付的功能:

  1. class QQpay:
  2. def pay(self,money):
  3. print('使用qq支付%s元' % money)
  4.  
  5. class Alipay:
  6. def pay(self,money):
  7. print('使用阿里支付%s元' % money)
  8.  
  9. class Wechatpay: # 野生程序员一般不会看别人怎么写,自己才是最好,结果......
  10. def fuqian(self,money):
  11. print('使用微信支付%s元' % money)
  12.  
  13. def pay(obj,money):
  14. obj.pay(money)
  15.  
  16. a = Alipay()
  17. b = QQpay()
  18.  
  19. pay(a,100)
  20. pay(b,200)
  21.  
  22. c = Wechatpay()
  23. c.fuqian(300)

结果春哥,受惩罚了,限期整改,那么春哥,发奋图强,看了太白教你学python的相关资料,重新梳理的代码:

  1. class Payment:
      """ 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
    """
  2. def pay(self,money):pass
  3.  
  4. class QQpay(Payment):
  5. def pay(self,money):
  6. print('使用qq支付%s元' % money)
  7.  
  8. class Alipay(Payment):
  9. def pay(self,money):
  10. print('使用阿里支付%s元' % money)
  11.  
  12. class Wechatpay(Payment):
  13. def fuqian(self,money):
  14. print('使用微信支付%s元' % money)
  15.  
  16. def pay(obj,money):
  17. obj.pay(money)
  18.  
  19. a = Alipay()
  20. b = QQpay()
  21.  
  22. pay(a,100)
  23. pay(b,200)
  24.  
  25. c = Wechatpay()
  26. c.fuqian(300)

但是,这样还会有问题,如果再来野生程序员,他不看其他的支付方式,也不知道为什么继承的类中要定义一个没有意义的方法,所以他会是会我行我素:

  1. class Payment:
  2.   """ 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
  3. """
  4. def pay(self,money):pass
  5.  
  6. class QQpay(Payment):
  7. def pay(self,money):
  8. print('使用qq支付%s元' % money)
  9.  
  10. class Alipay(Payment):
  11. def pay(self,money):
  12. print('使用阿里支付%s元' % money)
  13.  
  14. class Wechatpay(Payment):
  15. def fuqian(self,money):
  16. print('使用微信支付%s元' % money)
  17.  
  18. def pay(obj,money):
  19. obj.pay(money)
  20.  
  21. a = Alipay()
  22. b = QQpay()
  23.  
  24. pay(a,100)
  25. pay(b,200)
  26.  
  27. c = Wechatpay()
  28. c.fuqian(300)

所以此时我们要用到对类的约束,对类的约束有两种:

1. 提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.

2. 使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.

先用第一种方式解决:

  1. class Payment:
  2. """
  3. 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
  4. """
  5. def pay(self,money):
  6. raise Exception("你没有实现pay方法")
  7.  
  8. class QQpay(Payment):
  9. def pay(self,money):
  10. print('使用qq支付%s元' % money)
  11.  
  12. class Alipay(Payment):
  13. def pay(self,money):
  14. print('使用阿里支付%s元' % money)
  15.  
  16. class Wechatpay(Payment):
  17. def fuqian(self,money):
  18. print('使用微信支付%s元' % money)
  19.  
  20. def pay(obj,money):
  21. obj.pay(money)
  22.  
  23. a = Alipay()
  24. b = QQpay()
  25. c = Wechatpay()
  26. pay(a,100)
  27. pay(b,200)
  28. pay(c,300)

第二种方式:引入抽象类的概念处理。

  1. from abc import ABCMeta,abstractmethod
  2. class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
  3. @abstractmethod
  4. def pay(self):pass # 抽象方法
  5.  
  6. class Alipay(Payment):
  7. def pay(self,money):
  8. print('使用支付宝支付了%s元'%money)
  9.  
  10. class QQpay(Payment):
  11. def pay(self,money):
  12. print('使用qq支付了%s元'%money)
  13.  
  14. class Wechatpay(Payment):
  15. # def pay(self,money):
  16. # print('使用微信支付了%s元'%money)
  17. def recharge(self):pass
  18.  
  19. def pay(a,money):
  20. a.pay(money)
  21.  
  22. a = Alipay()
  23. a.pay(100)
  24. pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
  25. q = QQpay()
  26. q.pay(100)
  27. pay(q,100)
  28. w = Wechatpay()
  29. pay(w,100) # 到用的时候才会报错
  30.  
  31. # 抽象类和接口类做的事情 :建立规范
  32. # 制定一个类的metaclass是ABCMeta,
  33. # 那么这个类就变成了一个抽象类(接口类)
  34. # 这个类的主要功能就是建立一个规范

总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:

1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的

2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)

python基础学习笔记——类的约束的更多相关文章

  1. python基础学习笔记——类的成员

    一. 细分类的组成成员 之前咱们讲过类大致分两块区域,如下图所示: 每个区域详细划分又可以分为: class A: company_name = '老男孩教育' # 静态变量(静态字段) __ipho ...

  2. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  3. python 基础学习笔记(1)

    声明:  本人是在校学生,自学python,也是刚刚开始学习,写博客纯属为了让自己整理知识点和关键内容,当然也希望可以通过我都博客来提醒一些零基础学习python的人们.若有什么不对,请大家及时指出, ...

  4. Python 基础学习笔记(超详细版)

    1.变量 python中变量很简单,不需要指定数据类型,直接使用等号定义就好.python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前 ...

  5. Python基础学习笔记(十三)异常

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...

  6. Python基础学习笔记(十一)函数、模块与包

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-functions.html 3. http://www.liao ...

  7. Python基础学习笔记(一)入门

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-chinese-encoding.html 3. http://w ...

  8. Python基础学习笔记(十二)文件I/O

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-files-io.html ▶ 键盘输入 注意raw_input函 ...

  9. Python基础学习笔记(十)日期Calendar和时间Timer

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-date-time.html 3. http://www.liao ...

随机推荐

  1. JS的使用

    Javascript代码在浏览器中运行,做出更流畅.优美的页面效果,增强用户体验与java是完全不同的东西,只是名称类似而已写在<script></script>标签中 大小写 ...

  2. Linux命令-4类

    一.系统管理与维护   1. pwd:print working directory    打印工作目录   2. cd:  change directory    改变或进入路径       ● c ...

  3. springboot 2.0 Redis command timed out的解决

    环境:springboot 2.0.7 spring data redis springboot从1.x升级到2.x后,spring data redis使用的redis客户端驱动从1.x的jedis ...

  4. Android 适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

  5. Android 第三方库导致jar包冲突解决办法

    这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题 合并方法: 在app的build.gradle中添加 dependencies { compile ('com.mapbox. ...

  6. vim的命令

    下面是从一个博客里摘抄出来的, 供自己学习使用.   在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n= ...

  7. Android中,Broadcas介绍

    什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们 ...

  8. MySQL开启skip-name-resolve和skip-networking优化

    使用skip-name-resolve增加远程连接速度 skip-name-resolve 该选项表示禁用DNS解析,属于官方一个系统上的特殊设定不管,链接的的方式是经过hosts或是IP的模式,他都 ...

  9. cmd下查询端口占用以及根据进程id名称结束进程

    cmd窗口中: C:\Users\insentek>netstat -aon|findstr "1099" TCP 0.0.0.0:1099 0.0.0.0:0 LISTEN ...

  10. 【Python图像特征的音乐序列生成】关于音乐生成的思路转变

    在前几天的讨论会上,有师兄指出原来的方法实在是很难训练,所以我改进了音乐生成的思路. 首先,我用LSTM生成的一定是一段音乐的序列化表达,那么我就可以用成型的一些数据集去训练LSTM.为了避免生成的音 ...