接口继承

接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的

基类里面的方法不用具体的实现,只是一个规范而已

1.1实现一个一切皆文件的概念

  1. class Disk:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Cdrom:
  7. def read(self):
  8. pass
  9. def write(self):
  10. pass
  11. class Mem:
  12. def read(self):
  13. pass
  14. def write(self):
  15. pass

1.2可以定义一个基类,对上面代码进行改进

  1. class Allfile:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Disk(Allfile):
  7. def read(self):
  8. print("disk read")
  9. def write(self):
  10. print("disk write")
  11. class Cdrom(Allfile):
  12. def read(self):
  13. print("cdrom read")
  14. def write(self):
  15. print("cdrom write")
  16. class Mem(Allfile):
  17. def read(self):
  18. print("mem read")
  19. def write(self):
  20. print("mem write")

1.3但是子类也可以不按照你规定的出牌,Mem就是不听话,他不定义write的函数属性,然后就会从父类找。父类里面又是pass

  1. class Allfile:
  2. def read(self):
  3. pass
  4. def write(self):
  5. pass
  6. class Disk(Allfile):
  7. def read(self):
  8. print("disk read")
  9. def write(self):
  10. print("disk write")
  11. class Cdrom(Allfile):
  12. def read(self):
  13. print("cdrom read")
  14. def write(self):
  15. print("cdrom write")
  16. class Mem(Allfile):
  17. def read(self):
  18. print("mem read")
  19. m1=Mem()
  20. m1.read()
  21. m1.write()
  22.  
  23. C:\python35\python3.exe D:/pyproject/day25/接口继承.py
  24.  
  25. mem read

1.4所以python就有一个专门的模块来实现这个强制性的约束子类,模块叫abc

导入模块abc,给父类2个属性加上装饰器之后,如果子类再少属性的话,就直接报错了,这样就强制性的约束了子类必须有父类的2个方法了

  1. import abc
  2. class Allfile(metaclass=abc.ABCMeta):
  3. @abc.abstractstaticmethod
  4. def read(self):
  5. pass
  6. @abc.abstractstaticmethod
  7. def write(self):
  8. pass
  9. class Disk(Allfile):
  10. def read(self):
  11. print("disk read")
  12. def write(self):
  13. print("disk write")
  14. class Cdrom(Allfile):
  15. def read(self):
  16. print("cdrom read")
  17. def write(self):
  18. print("cdrom write")
  19. class Mem(Allfile):
  20. def read(self):
  21. print("mem read")
  22. m1=Mem()
  23.  
  24. TypeError: Can't instantiate abstract class Mem with abstract methods write

1.5当子类Mem也加上write这个方法之后就可以正常运行了

  1. import abc
  2. class Allfile(metaclass=abc.ABCMeta):
  3. @abc.abstractstaticmethod
  4. def read(self):
  5. pass
  6. @abc.abstractstaticmethod
  7. def write(self):
  8. pass
  9. class Disk(Allfile):
  10. def read(self):
  11. print("disk read")
  12. def write(self):
  13. print("disk write")
  14. class Cdrom(Allfile):
  15. def read(self):
  16. print("cdrom read")
  17. def write(self):
  18. print("cdrom write")
  19. class Mem(Allfile):
  20. def read(self):
  21. print("mem read")
  22. def write(self):
  23. print("mem write")
  24. m1=Mem()
  25. m1.read()
  26. m1.write()
  27.  
  28. mem read
  29.  
  30. mem write

python之接口继承的更多相关文章

  1. python定义接口继承类

    zxq547 python定义接口继承类invalid syntax解决办法 1 2 3 4 5 6 7 class s_all(metaclass=abc.ABCMeta):     #python ...

  2. python定义接口继承类invalid syntax解决办法

    class s_all(metaclass=abc.ABCMeta): #python2.7用此方法定义接口继承 # __metaclass__ = abc.ABCMeta @abc.abstract ...

  3. python的类的继承-接口继承-归一化设计

    1.先在子类本身找,如果子类没有,会去父类找 class Dad: '这个是爸爸类' money=10#Dad类的数据属性 def __init__(self,name): print("爸 ...

  4. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  5. python 静态 封装 继承 mro 接口 super

    1.静态属性 静态方法  类方法 #!/usr/bin/python env # encoding: utf-8 # 静态属性 静态方法 class Room: tag = 168 def __ini ...

  6. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  7. python基础之继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  8. Python学习第十八课——继承,接口继承等

    1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...

  9. [技术学习]js接口继承

    js是面向对象语言,但是js又缺乏了面向对象的诸多特性,比如继承,没有接口继承也没有父类继承,因此有时候需要人工来实现继承. 一.首先看下java中面向对象的继承: //定义类鸟类的飞行动作 inte ...

随机推荐

  1. 神奇的JAVA多态

    以前理解了基本思想,这版本的演示和应用比较真实. 顺路下来抽象方法和类,接口,就顺理成章啦... JAVA文件放一块了,分别对照前一个帖子的文件名: ///////////////////////// ...

  2. 介绍一个不错的服务器综合监控工具脚本集aspersa

    http://blog.csdn.net/jackyrongvip/article/details/9217869

  3. redis-不常用的命令

    在不重启redis服务器的情况下,动态的修改Redis的配置 redis> config set loglevel warning

  4. hdu1018--斯特灵公式

    斯特灵公式 Wiki http://zh.wikipedia.org/wiki/斯特林公式 /** \brief hdu 1018 * * \param date 2014/7/24 * \param ...

  5. Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中

    在Lua Code中注冊C/C++的枚举很easy,就像注冊全局变量一样.我们使用枚举名称作为命名空间,来避免注冊的枚举发生冲突.注冊的枚举存储在全局环境(线程环境)中. 当在Lua Code中訪问枚 ...

  6. LLVM每日谈之十九 LLVM的第一本系统的书<Getting Started with LLVM Core Libraries>

    作者:史宁宁(snsn1984) LLVM最终有了一本系统的书了--<Getting Started with LLVM Core Libraries>. 这本书号称是LLVM的第一本书, ...

  7. PlayerPrefs存储Vector3等结构数据

     孙广东   2016.3.31 之前有网友询问这个问题, 当时我仅仅是 提供了一个思路, 使用json序列化.反序列化. 以下就写出两种(都是仅仅能变成字符串) 1.json的序列化.反序列化方 ...

  8. Qt5.9 提供Qt Remote Objects,OAuth1 & OAuth2,重写了QML的GC

    Technology Preview Modules Qt Remote Objects - A module that allows you to easily share QObject inte ...

  9. c17---指针

    // // main.c // 指针基本概念 #include <stdio.h> // 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值不会影响到外面实参的值 void cha ...

  10. ES Segment Memory——本质上就是segment中加到内存的FST数据,因此segment越多,该内存越大

    ElasticSearch优化系列四:ES的heap是如何被瓜分掉的 转自:https://www.jianshu.com/p/f41b706db6c7 以下分别解读几个我知道的内存消耗大户: Seg ...