钩子函数

控制子类的的创建

1、元类

  这种方式可能是最常见的也是我们最先知晓的,当然这种方式可能需要我们对元类有比较深入的了解,所以引入了下面的这种方式

2、钩子函数

  __init__subclass__,字面意思,父类实现了该双下方法,其后凡是继承他的派生类,都会触发此方法,进行派生类的初始化,实现派生类属性的增加及修改

 1 class Meta:
 2     def __init_subclass__(cls, **kwargs):
 3         # 改变子类行为,增加类属性
 4         cls.origin_val = "只有永不遏制的奋斗"
 5         for k in kwargs:
 6             setattr(cls, k, kwargs[k])
 7 
 8         # 增加类方法
 9         def overwrite():
10             print("测试")
11 
12         setattr(cls, "func", overwrite)
13 
14 
15 class A(Meta, name="g", age=26):
16     ...
17 
18 
19 class B(Meta):
20     ...
21 
22 
23 if __name__ == '__main__':
24     print(A.origin_val, A.name, A.age)
25     A.func()
26     print(A.__dict__)
27     print(B.__dict__)

output: 

  只有永不遏制的奋斗 g 26
  测试
  {'__module__': '__main__', '__doc__': None, 'origin_val': '只有永不遏制的奋斗', 'name': 'g', 'age': 26, 'func': <function Meta.__init_subclass__.<locals>.overwrite at 0x0000026737322310>}
  {'__module__': '__main__', '__doc__': None, 'origin_val': '只有永不遏制的奋斗', 'func': <function Meta.__init_subclass__.<locals>.overwrite at 0x0000026737322280>}

 另外补充一句:今年的新书《python工匠...》目前浅看了三章,一个词,相见恨晚,感兴趣我觉得是可以学习学习的

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:钩子函数 - Python技术站

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

相关文章

  • 多组合少继承

    继承:   强调类与类之间的关系 组合:   强调对象和对象之间的关系 清楚python支持多继承,从而涉及到一些MRO的点,这里不做赘述,在实际工作过程中,我们经常会使用继承来实现代码复用,如果仅仅是为了复用,还是比较推荐使用组合方式,因为继承方式,使得类与类之间的耦合性变得异常紧密,这多少违背了迪米特法则 1 “”” 2 OOP中三大特性之一:继承 3 …

    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
  • fastapi篇(一)

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

    python 2023年5月9日
    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
  • __call__用法简谈

      python一切皆对象,从是否可调用层面讲,对象又可以分为可调用对象、不可调用对象 在本篇中,类中实现__call__双下方法,即将该类的实例变为可调用对象   普通类未实现__call__的方法,实例是不可调用的,先看 1 class Valley: 2 … 3 4 5 if __name__ == ‘__main__’: 6 v = Valley…

    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
  • pyqt入门

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

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