抽象类的子类化机制

抽象类:可以作为顶层基类,从高层次规范编程接口

1、在abc模块中,最常见的抽象类有Iterable,我们可以用他判断一个对象是不是可迭代对象
 1 from collections.abc import Iterable
 2 
 3 
 4 class Valley:
 5 
 6     def __iter__(self):
 7         ...
 8 
 9 
10 if __name__ == "__main__":
11     print(isinstance(Valley(), Iterable))

output:

  True

2、抽象类的子类化机制

  2.1、重写__subclasshook__类方法,定制抽象类的子类判断逻辑,这种子类化形式只关心结构,不关心真实的继承关系,称之为:结构化子类

 1 import abc
 2 
 3 
 4 class A(abc.ABC):
 5     @classmethod
 6     def __subclasshook__(cls, c):
 7         if any("verify" in b.__dict__ for b in c.__mro__):
 8             return True
 9         return False
10 
11 
12 class Valley:
13     def __init__(self):
14         ...
15 
16     def verify(self):
17         print(1)
18 
19 
20 if __name__ == "__main__":
21     print(isinstance(Valley(), A))

output:

   True

  2.2、继承抽象基类元类register方法直接注册

 1 import abc
 2 
 3 
 4 class A(abc.ABC):
 5     ...
 6 
 7 
 8 class Valley:
 9     def __init__(self):
10         ...
11 
12     def verify(self):
13         print(1)
14 
15 
16 A.register(Valley)
17 if __name__ == "__main__":
18     print(isinstance(Valley(), A))

 目前未找到合适的应用场景,希望知晓的可以在下面写个小demo,我参考参考

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:抽象类的子类化机制 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 工匠回忆(三)

    接上文 7、函数   7.1、长度   7.2、圈复杂度   7.3、函数内代码确保处在同一抽象层内,主流程清晰,不存在穿插的分支   7.4、有状态的函数     7.4.1、全局变量     7.4.2、闭包函数     7.4.3、类     比较偏向于后两者   8、装饰器   装饰器和装饰器模式是两个完全不同的概念   1、三方模块wrapt的引入…

    python 2023年5月6日
    00
  • 比较赋值、浅拷贝、深拷贝

    1、无论是浅拷贝还是深拷贝,拷贝对象后是否会开辟新内存,取决于被拷贝对象的数据类型是否可变,一般来讲,可变的数据类型会开辟新内存,不可变数据类型反之不会开辟新内存,进行内存地址的引用(-5-256以外的大整数池会开辟内存,注:但我本地进行测试比较内存还是一样的,有问题) 2、要在单层、嵌套型对象中逐一比较拷贝 3、浅拷贝和深拷贝的区别主要体现在对嵌套型结构的…

    Python开发 2023年4月2日
    00
  • pyqt入门

      第一次接触pyqt是在20年刚毕业的时候,时隔两年,恰逢闲暇,正好回过头来对这个模块的知识进行一个整理,不会做系统化的整理,我打算可能会围绕之前做过的小工具对其涉及到的控件、信号和槽等知识进行简单的回忆。后面工作如果再涉及或者想到其他的,会再回来更新完善。   pyqt5:同前面整理的kivy一样,同属于GUI开发框架的范畴,不同的是,pyqt用于桌面应…

    2023年4月2日
    00
  • 派生类中扩展属性

    对于在父类中存在的属性,如果要在其派生类中继续扩展属性   可以这样实现 1 class Valley: 2 def __init__(self): 3 self._name = None 4 5 @property 6 def name(self): 7 return self._name 8 9 @name.setter 10 def name(self…

    Python开发 2023年4月2日
    00
  • fastapi篇(一)

    fastapi是一个高性能的web开发框架 性能极高,可与 NodeJS, Go 媲美。(得益于Starlette和Pydantic)。 Starlette 是一个轻量级 ASGI 框架/工具包。它非常适合用来构建高性能的 asyncio 服务,并支持 HTTP 和 WebSockets。 官方网址:https://www.starlette.io/   P…

    python 2023年5月9日
    00
  • 钩子函数

    控制子类的的创建 1、元类   这种方式可能是最常见的也是我们最先知晓的,当然这种方式可能需要我们对元类有比较深入的了解,所以引入了下面的这种方式 2、钩子函数   __init__subclass__,字面意思,父类实现了该双下方法,其后凡是继承他的派生类,都会触发此方法,进行派生类的初始化,实现派生类属性的增加及修改 1 class Meta: 2 de…

    Python开发 2023年4月2日
    00
  • __slots__

      在类的层次上定义时,python给实例采用一种更加紧凑的内部表示来管理属性,而非字典,这样,我们只被允许访问__slots__内部的属性   这样定义会带来两点好处,然后具体的实践我在工作中目前运用的还很少,后面如果发现还有什么坑,我再来补充 1、创建大量实例时节省内存 2、访问属性快 1 class Valley: 2 __slots__ = “nam…

    Python开发 2023年4月2日
    00
  • 泛型

    第一个参数类型决定执行特定的方法体 一、单分派泛函数   只对函数的第一个参数做类型检查,发现局限性太大,没什么特别的应用场景,也可能是我没用到 1 from functools import singledispatch 2 3 4 @singledispatch 5 def func(a, *args): 6 raise TypeError(“暂不支持{…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部