控制子类的的创建

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工匠...》目前浅看了三章,一个词,相见恨晚,感兴趣我觉得是可以学习学习的

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。