python 使用abc实现接口类/虚类(2.2)
python 使用abc实现接口类/虚类
具体类
class BaseA:
def run(self):
print('base A running')
class ChildA(BaseA):
def run(self):
print('child a')
# 具体类可以直接继承也可以实现多态
a = BaseA()
a.run()
a = ChildA()
a.run()
虚类
class BaseB():
@abc.abstractmethod
def run(self):
return NotImplemented
def hello(self):
print('hello')
# 直接实例化不会会报错
b = BaseB() # 这里没有正确的实现虚类,正确实现看馅饼
b.run()
output: return NotImplemented
纯虚类 也就是接口类
# python2 不是继承ABC,使用 __metaclass__ = ABCMeta
class BaseE(abc.ABC):
@abc.abstractmethod
def run(self):
return NotImplemented
@abc.abstractmethod
def hello(self):
return print('hello')
class ChildE1(BaseE):
pass
class ChildE2(BaseE):
@abc.abstractmethod
def run(self):
print('e')
class ChildE3(BaseE):
def run(self):
print('e')
# e = BaseE() 报错
# e = ChildE2() 报错
e = ChildE3()
e.hello()
e.run()
继承虚类后想要改变参数类型怎么办
# 给新的参数一个默认值, 可以满足新的参数的调用
# 这样可以满足原来的参数对函数的调用,不必改变后续代码
class ChildE4(BaseE):
def run(self, new_arg =1):
print(new_arg)
可不可以实现 同一个函数不同的参数列表
class Test():
def run(self):
print('1')
def run(self, temp):
print(temp)
t = Test()
# t.run() 报错了
t.run(1)
# 所以python并没有c++里那样的virtual table去根据参数数量,去判断和使用不同的函数
python 使用abc实现接口类/虚类(2.2)的更多相关文章
- python 用abc模块构建抽象基类Abstract Base Classes
见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/01 16:58 from abc import ABCMet ...
- Python面向对象 | 抽象类和接口类
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- C#类、接口、虚方法和抽象方法0322
虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...
- 简述java接口和C++虚类的相同和不同之处
C++虚类相当于java中的抽象类,与接口的不同处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方法 ...
- python之继承、抽象类、新式类和经典类
一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- Python面向对象6:抽象类和自定义类
抽象类- 抽象方法: 没有具体实现内容的方法成为抽象方法- 抽象方法的主要意义是规范了子类的行为和接口- 抽象类的使用需要借助abc模块 import abc - 抽象类:包含抽象方法的类叫抽象类,通 ...
- Java学习笔记_22_Set接口的实现类
22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不 ...
随机推荐
- foreach循环的跳出
由于foreach循环中不像for循环可以直接通过return或break来终止当前循环,不过这里可以借助try...catch...来完成var arr = [1,2,3,4,5,6,7,8,9,1 ...
- PHP FILTER_SANITIZE_SPECIAL_CHARS 过滤器
定义和用法 FILTER_SANITIZE_SPECIAL_CHARS 过滤器对特殊字符进行 HTML 转义. 该过滤器用于转义 "<>& 以及 ASCII 值在 32 ...
- putty字体和颜色修改
来源:https://www.igvita.com/2008/04/14/custom-putty-color-themes/ 网站上有putty的注册表,可以修改putty显示的配色方案. 非常棒!
- 聊一聊JavaScript中的事件循环
一.概念:事件循环 JavaScript是单线程的 1.整片 script 整体代码(第一个宏任务)放到执行栈中,执行之后,会触发很多方法 这些方法只能一个个的顺序执行,不能并发 2.这些要执行的方法 ...
- /etc/fstab修改及mkfs(e2label)相关应用与疑问
http://blog.chinaunix.net/uid-23392298-id-62318.html 我们将以问题开始说明: 案例: 由于n年前的误操作,导致系统启动的时候,提示如下错误:Coul ...
- 提取json对象中的数据,转化为数组
var xx1 = ["乐谱中的调号为( )调", "写出a自然小调音阶.", "以G为冠音,构写增四.减五音程.", "调式分析 ...
- 通过Bochs分析Lilo启动Linux内核的过程
1. Bochs调试 参考:http://www.cnblogs.com/long123king/p/3414884.html http://bochs.sourceforge.net/cgi-bin ...
- 线程创建后为什么要调用CloseHandle
很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); ...
- 如何设置linux启动过程中的停止阶段
设置方法: 1 启动过程中点击“e”键(fedora)或者"tab"(centOS)键进入目标启动项的命令行参数下,移除initrd所在行末尾的"quiet" ...
- html5语义化标签大全
常见的语义化标签有 <article>.<section>.<nav>.<aside>.<header>.<footer> 详细 ...