抽象类的子类化机制

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

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日

相关文章

  • 编程思想

    三大编程思想:   POP:面向过程编程(Procedure Oriented Programming)   OOP:面向对象编程(Object Oriented Programming)   AOP:面向切面编程(Aspect Oriented Programming) 以下大部分内容引用腾讯云一位笔者,我也是进一步了解纯记录之目的。 POP ​   面向…

    Python开发 2023年4月2日
    00
  • 线程锁在单例模式中的应用

    多个线程在执行过程中会因为竞争同一个资源而产生线程冲突,造成死锁,从而引出线程锁这个概念 先拿到锁再执行业务操作: 当然我对这一块了解的还不透彻,只是了解在不加锁的多线程情况下,会破坏单例模式,所以就有了下面这一段 1 import time 2 import threading 3 4 5 def decorator(func): 6 lock = thr…

    Python开发 2023年4月2日
    00
  • 浅用描述符

      可以理解为property方法的一种进阶,都可以用来创建一种新形式的实例属性,即在实例属性值的获取和设定上,增加额外的处理事务,such as:类型检查、验证   重写三个属性访问方法,其中__delete__方法是否重写取决需求   在类层次上引用描述符,即该类遵从描述符协议 1 class Check: 2 def __init__(self, na…

    Python开发 2023年4月2日
    00
  • 猴子补丁

    作用:随时修改代码   (在函数或类定义完成之后,再去修改函数的实现过程) “””类似猴子补丁在函数定义好之后,再去更改他的行为”””import typesclass Valley: def func(self): return “等待宣告”def common(self): return “只有永不遏制的奋斗”if __name__ == ‘__main…

    Python开发 2023年4月2日
    00
  • 迭代器执行切片

    普通的切片对迭代器无法实行切片操作 1 from itertools import islice 2 3 4 def func(): 5 for i in [4, 9, 6, 2]: 6 if i % 2 == 0: 7 yield i 8 9 10 f = func() 11 res = islice(f, 3) 12 for i in res: 13 p…

    Python开发 2023年4月2日
    00
  • 工匠回忆(二)

    接上文 4、条件分支控制流   避免分支嵌套,异常放在代码片段最前面   4.1、归约函数   4.2、条件表达式的封装避免过长而导致可读性下降   4.3、德摩根定律   4.4、and、or优先级   4.5、or短路效应   4.6、消失的分支     4.6.1、二分查找算法     4.6.2、字典算法   5、异常错误处理   无需多言   6、…

    python 2023年5月4日
    00
  • 面向对象之多态

    鸭子类型   我们都知道面向对象的语言有三大特性:封装、继承和多态,在这里我浅谈一下python的多态 1 class PageOne: 2 def status(self): 3 return “按期申报页” 4 5 6 class PageTwo: 7 def status(self): 8 return “其他申报页” 9 10 11 class Pa…

    Python开发 2023年4月2日
    00
  • 生成器的反向验证

    生成器是一种特殊的迭代器,也可以说其父类型是迭代器   1、迭代器其实也有很多点要清楚,这里先不做赘述   2、要清楚,迭代器调用iter()返回的是自身 1 def func(s, e): 2 “”” 3 生成器函数 4 :param s:起始值 5 :param e: 末值 6 :return: 7 “”” 8 num = s 9 while num &…

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