首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 19:01
  • 2201
  • 9043
blog.csdn.net

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

二、    语法
1.    虚拟子类定义的前面步骤都与真实子类相同,首先都是import  abc 模块,然后定义抽象基类;
2.    定义子类;
3.    将子类注册为抽象基类的虚拟子类,语法为:
基类名. register(子类名)三、    例子说明
1、    以上节的Shape类为例,定义抽象基类

  1. from abc import ABC, abstractmethod
  2. class Shape(ABC):
  3.     @abstractmethod
  4.     def getArea():pass  #定义获取面积的抽象方法
  5.     
  6.     @abstractmethod
  7.     def getGirth():pass  #定义获取周长的抽象方法


2、    定义非Shape派生类

  1. class House():
  2.      def __init__(self,area):self.area=area
  3.      def showArea(self):return self.area

3、    将House类注册为Shape的子类

Shape.register(House)

4、    定义House类实例化变量

house=House(100)

5、    查看House类是否为Shape子类,实例house是否为Shape的实例

  1. issubclass(House,Shape)
  2. isinstance(house,Shape)

四、    执行代码及截图 

  1. #coding:utf-8
  2. #抽象类虚拟子类
  3. from abc import ABC, abstractmethod
  4. class Shape(ABC):
  5.     @abstractmethod
  6.     def getArea():pass  #定义获取面积的抽象方法
  7.     
  8. class House():
  9.      def __init__(self,area):self.area=area
  10.      def showArea(self):return self.area
  11.       
  12. Shape.register(House)
  13. issubclass(House,Shape)
  14. house=House(100)
  15. isinstance(house,Shape)
  16. house.getArea()#执行报错,没有该方法
  17. class House():#调整类定义,将showArea方法改成getArea
  18.      def __init__(self,area):self.area=area
  19.      def getArea(self):return self.area
  20. issubclass(House,Shape)#由于类重新定义,该函数应该返回False
  21. Shape.register(House)#重新注册虚拟子类
  22. house=House(100)#重新定义变量:
  23. issubclass(House,Shape)
  24. isinstance(house,Shape)


本节结合案例详细介绍了通过子类注册到抽象基类的方式实现虚拟子类的方法,注册虚拟子类无需子类实现抽象基类的所有抽象方法,在某些特定场景下非常有用。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树网络爬虫正则表达式333596 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/93091835"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top