钩子函数

控制子类的的创建

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日

相关文章

  • 方法的多种调用方式

      方法调用确实我们每个人都会,但是我觉得大家可能用的最多的就是那种常规的方式,这里呢,我要记录一下另外几种方式 1 from operator import attrgetter 2 from operator import methodcaller 3 4 5 class Valley: 6 def func(self): 7 print(“测试方法”)…

    Python开发 2023年4月2日
    00
  • 循环优化一

    主角:takewhile   判断序列中元素是否为偶数,奇数则终止 这是我们最常用的一种方式,其实没必要这么复杂 1 a = [4, 6, 7, 3] 2 3 4 def judge_is_even(item): 5 if item % 2 == 0: 6 return True 7 return False 8 9 10 # 最常用 11 for item…

    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
  • 派生类中扩展属性

    对于在父类中存在的属性,如果要在其派生类中继续扩展属性   可以这样实现 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
  • 在*args, **kwargs上强制规定参数的调用约定

      首先我们要知道任何关于函数调用签名的问题,都和inspect模块有着关系   这个知识点涉及到两个类:               Signature、               Parameter创建一个签名对象,这是个重点 1 from inspect import Signature, Parameter 2 3 params = [Parame…

    Python开发 2023年4月2日
    00
  • 德摩根定律

    命题逻辑里的一个法则   定义:非p或非q=非(p且q)   最近在看一本书啊《python工匠……》一个腾讯大佬写的,从这里面了解到这个东西,确实不错 1 1 # 德摩根定律 2 2 def func(): 3 3 a = 10 4 4 b = 20 5 5 if not a < 5 or not b < 10: 6 6 print(a…

    Python开发 2023年4月2日
    00
  • 编程思想

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

    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
合作推广
合作推广
分享本页
返回顶部