python @register_第7.21节 Python抽象类—register注册虚拟子类

2023-11-16

上两节介绍了Python抽象类的真实子类的定义和使用,本节介绍另一种抽象类的实现方法:虚拟子类方法。

一、    相关概念

虚拟子类是将其他的不是从抽象基类派生的类”注册“到抽象基类,让Python解释器将该类作为抽象基类的子类使用,因此称为虚拟子类,这样第三方类不需要直接继承自抽象基类。注册的虚拟子类不论是否实现抽象基类中的抽象内容,Python都认为它是抽象基类的子类,调用 issubclass(子类,抽象基类),isinstance (子类对象,抽象基类)都会返回True。

这种通过注册增加虚拟子类是抽象基类动态性的体现,也是符合Python风格的方式。它允许我们动态地,清晰地改变类的属别关系。当一个类继承自抽象基类时,该类必须完成抽象基类定义的语义;当一个类注册为虚拟子类时,这种限制则不再有约束力,可以由程序开发人员自己约束自己,因此提供了更好的灵活性与扩展性(当然也带来了一些意外的问题)。这种能力在框架程序使用第三方插件时,采用虚拟子类即可以明晰接口,只要第三方插件能够提供框架程序要求的接口,不管其类型是什么,都可以使用抽象基类去调用相关能力,又不会影响框架程序去兼容外部接口的内部实现。老猿认为,从某种程度上讲,虚拟子类这种模式,是在继承这种模式下的一种多态实现。

二、    语法

1.    虚拟子类定义的前面步骤都与真实子类相同,首先都是import  abc 模块,然后定义抽象基类;

2.    定义子类;

3.    将子类注册为抽象基类的虚拟子类,语法为:

基类名. register(子类名)三、    例子说明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python @register_第7.21节 Python抽象类—register注册虚拟子类 的相关文章

  • python3 with.py

    模块 python3 with py 参考 https docs python org zh cn 3 reference compound stmts html with https docs python org zh cn 3 ref
  • 关于海量用户访问的通用技术架构的一些思考

    最近12306 cn网站事件引起了很多人对架构的思考 这种访问量巨大的网站究竟该如何来做架构 下面是我的想法 因为要考虑到通用抛开业务单纯从技术层面分析 要承载海量用户的访问 要求网站高性能和高可用 安全可靠 高可收缩性 易于维护 等等一堆
  • 20道常见的kafka面试题以及答案

    JAVA面试宝典 搞定JAVA面试 不再是难题 系列文章传送地址 请点击本链接 目录 1 kafka的消费者是pull 拉 还是push 推 模式 这种模式有什么好处 2 kafka维护消息状态的跟踪方法 3 zookeeper对于kafk
  • jq微信账号正则表达式

    微信号官方规则 必须以字母或下划线开头 可以使用6 20位数字 字母 下划线 减号或它们的组合 正则表达式 a zA Z a zA Z0 9 6 20 如有其它问题欢迎大家留言
  • excel批量提取多个文件单元格_EXCEL高手专用函数Indirect,快速提取多个工作表,特定单元格数据...

    Indirect间接引用函数 你应学会的跨表引用技能 点关注 交朋友 大家共同学技术 几天前 看到有人问 excel中有哪些技能是你以前不知道 但是后来知道了却一直没有忘记的 我首先想到了 Indirect函数 使我的工作效率提高了百倍 千
  • vue常用知识总结

    vue常用知识总结 vue简介 vue 响应式原理 Object defineProperty vue 的作者 尤雨溪 java 出身 vue 是什么 以数据驱动视图的单页面 spa 渐进式 MVVM 框架 特性 数据双向绑定 模块化开发
  • Embarcadero Dev-C++第一次使用注意事项

    Embarcadero Dev C 第一次使用注意事项 Embarcadero Dev C 简介 2000年左右 Bloodshed software开发了Dev C 提供轻量 免费 开源的C C IDE Dev C 是最适合初学C 语言的
  • 基于stm32单片机自动灭火火灾报警装置Proteus仿真

    资料编号 102 下面是相关功能视频演示 102 基于stm32单片机自动灭火火灾报警装置Proteus仿真 仿真 源码 全套资料 功能介绍 火焰传感器的原理 是通过感知外部特殊波段光照强度的突变来判断是否出现火灾 该仿真采用ADC采集光照
  • Maven 知识点总结

    文章目录 Maven 1 Maven 坐标 2 Maven 仓库 3 Maven 依赖 依赖配置 依赖范围 依赖调解原则 排除依赖 4 Maven 生命周期 5 Maven 聚合与继承 Maven Maven是一个项目管理工具 它包含了项目
  • c# MACD 算法实现

    此算法在自己WP7应用中 用到 同花顺 算法 DIFF EMA CLOSE SHORT EMA CLOSE LONG DEA EMA DIFF M MACD 2 DIFF DEA Zero 0 关键点是第一天的数据 如果是区间的数据 区间第
  • Bootstrap弹出模态框

    弹出模态框 Modal 使用Bootstrap的JavaScript模态框插件可以为您的网站添加醒目的提示和交互 用于通知用户 访客交互 消息警示或自定义的内容交互 如考试问答场景 译者注 运行原理 在开始使用Bootstrap模态框组件前
  • CMDB功能分析与实现方案

    CMDB功能分析与实现方案 CMDB系统的主要功能 1 用户管理 记录测试 开发 运维人员的用户表 2 业务线管理 记录业务的详情 3 项目管理 指定此项目属于那一条业务线 4 应用管理 指定此应用的开发人员 5 主机管理 记录主机管理员
  • 软件项目管理和实施方案

    一 实施周期 自合同签订或约定之日起xxx个日历日内完成项目需求调研 软件开发及调试工作 实现系统上线运行 并完成项目验收 二 项目进度 一 项目计划 根据本公司对项目建设工期的整体计划 本公司将整个系统的建设工作按照计划进行详细分工 把任
  • PCL-OpenCV冲突的解决方案

    测试LIO SAM 编译期报错 error field param k has incomplete type flann SearchParams 查了github 把 usr include pcl 1 7 pcl kdtree kdt
  • Dialog的弹出位置控制

    Dialog一般出现都是屏幕中心 但有的时候我们希望它能在屏幕左侧 或者右侧亦或者是屏幕顶部 这时候我们就需要用的Dialog getWindow getAttributes 方法啦 dialog new Dialog getActivit
  • Qwt使用总结,初步整理

    最近研究了一些Qwt 至此总结Qwt的认识以便以后的备忘 从什么方面开始说起呢 从这个类是什么 可以用来做什么 关于Qwt的简介就不说了 主要说说其中用到的几个类吧 QwtPlot 是一个2D画图控件 Widget 继承于QFram和Qwt
  • Mybatis Plus 3.1.0枚举类处理器重写TypeHandler

    我的环境 Springboot 2 13 Mybatis Plus 3 1 Oracle 11g 驱动版本oracle6 1 我尝试用 Mybatis Plus 3 1 以上版本 如 3 2 3 3 时 oracle6 驱动无法适配 2 枚
  • JAVA线程的中断

    每个线程都有一个boolean类型的标志来表明线程是否发生了中断 并且包含了中断相关的函数 interrupt 用于设置线程的中断状态为true isInterrupted 用于返回线程的中断状态 interrupted 方法用于清除中断状
  • cast函数_QT槽函数获取信号发送对象

    Qt 在槽函数中获取信号发送对象 Qt中提供了一个函数 qobject cast QObject object 可以通过这个函数判断信号发出对象 Qt 帮助文档的解释 Returns the given object cast to typ

随机推荐

  • 通讯录(C语言)

    结合指针 结构体 枚举 实现增删改查 test c 用于测试主函数 contact h 用于函数的声明 contact c 用于函数的实现 test c 主要思路 用do while 实现基本分支结构 并用枚举类型 规定出选择以增加代码可读
  • yarn创建vue项目报错解决

    1 使用yarn create vue创建项目时报如下错误 2 原因是由于安装包目录和bin目录不在统一磁盘下 查看方法 查看bin目录 yarn global bin 查看安装包目录 yarn global dir 3 解决 1 将yar
  • 代码审计工具之Fortify安装以及初步使用

    目录 1 Fortify Fortify工具介绍 1 Fortify Fortify工具介绍 Fortify SCA 是一个静态的 白盒的软件源代码安全测试工具 它通过内置的五大主要分析引擎 数据流 语义 结构 控制流 配置流等对应用软件的
  • 【Transformer】9、CrossFormer:A versatile vision transformer based on cross-scale attention

    文章目录 一 背景 二 动机 三 方法 3 1 Cross scale Embedding Layer CEL 3 2 Cross former Block 3 2 1 Long Short Distance Attention LSDA
  • 解决RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment

    RuntimeError CUDA unknown error this may be due to an incorrectly set up environment e g changing env variable CUDA VISI
  • IDEA代码规范插件(CheckStyle插件、alibaba插件)

    IDEA代码规范插件 CheckStyle插件 alibaba插件 代码规范插件 CheckStyle插件 alibaba插件 代码规范插件 CheckStyle插件 1 安装 打开idea的file settings plugins 再搜
  • 关于 微软商店无法加载页面 显示错误代码0x80131500的解决办法

    目录 一 误删系统文件导致Microsoft Store无法打开 1 运行 SFC 和 DISM 2 尝试修复或者重置微软应用商店 3 重新部署 Microsoft Store 4 运行Windows疑难解答 5 对系统镜像进行无损修复 二
  • 渗透测试——提权方式总结

    内容整理自网络 一 什么是提权 提权就是通过各种办法和漏洞 提高自己在服务器中的权限 以便控制全局 Windows User gt gt System Linux User gt gt Root 二 怎样进行提权 提权的方式有哪些 1 系统
  • AI算法工程师面试题基础精选

    AI算法工程师的相关面试题包括机器学习 深度学习以及强化学习等等 在面试时由于涉及范围比较广泛 一般面试官不会问一些比较深比较偏的问题 一般都会结合你经手的项目或者在校期间的项目进行一些算法的基础问题进行提问 在这里我们对在面试中常见中的基
  • 分享CSS3里box-shadow属性的使用方法,包括内阴影box-shadow:inset

    一 box shadow语法 box shadow none inset 可选值 不设置 为外投影 设置 为内投影 x offset 阴影水平偏移量 正方向为right y offset 阴影垂直偏移量 正方向为bottom blur ra
  • 记录好项目D16

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个电影购票系统 一 系统介绍 前台 普通用户注册 登录 注销 用户信息修改 邮箱 密码 头
  • Qt编译时,出现 first defined here,原因及解决方法

    场景 今天想着把之前写过的模块 都整合到一起 结果一编译程序就出现这个错误 原因 因为头文件出现重复包含了 后来我想了一下 我每个模块都是独立编写的 怎么会重复呢 然后去了pro文件里看了一下 里面果然有两个一模一样的头文件名 QT诚不欺我
  • Newtonsoft.Json基本使用

    Newtonsoft Json基本使用 使用强类型进行序列化反序列化 准备一个学生类 public class Student public string Name get set public int Age get set public
  • Android系统启动流程

    文章目录 总结 1 rc脚本语法规则 2 init进程启动 init first stage init second stage 3 ServiceManager启动 4 Zygote进程启动 5 Launcher启动 总结 android
  • [sql]使用sql语句增加列,并且设置默认值

    有的时候 我们需要对已存在的表进行插入列的情况 当然 可以使用navicat等工具直接可视化操作 命令行的话 如下 alter table 表名 add column 列名 数据类型 default 默认值 demo alter table
  • flutter开发实战-MethodChannel实现flutter与iOS双向通信

    flutter开发实战 MethodChannel实现flutter与iOS双向通信 最近开发中需要iOS与flutter实现通信 这里使用的MethodChannel 如果需要flutter与Android实现双向通信 请看 https
  • O-RAN专题系列-38:管理面-WG4.MP.V07-规范解读-第5章-软件管理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第5章 软件管理 5 1 Software Package 5 2 Software Inventory消息 5 3 Software
  • @Transactional事务注解

    1 实现原理 基于AOP面向切面的 它将具体业务与事务处理部分解耦 代码侵入性很低 2 Transactional注解可以作用于哪些地方 作用于类 当把 Transactional 注解放在类上时 表示所有该类的public方法都配置相同的
  • 使用正则表达式验证邮箱格式?

    需满足的验证逻辑 1 之前必须有内容且只能是字母 大小写 数字 下划线 减号 点 2 和最后一个点 之间必须有内容且只能是字母 大小写 数字 点 减号 且两个点不能挨着 3 最后一个点 之后必须有内容且内容只能是字母 大小写 数字且长度为大
  • python @register_第7.21节 Python抽象类—register注册虚拟子类

    上两节介绍了Python抽象类的真实子类的定义和使用 本节介绍另一种抽象类的实现方法 虚拟子类方法 一 相关概念 虚拟子类是将其他的不是从抽象基类派生的类 注册 到抽象基类 让Python解释器将该类作为抽象基类的子类使用 因此称为虚拟子类