zoukankan      html  css  js  c++  java
  • python中的__init_subclass__是什么?

    什么是__init_subclass__

    class Hook:
    
        def __init_subclass__(cls, **kwargs):
            print("__init_subclass__", cls, kwargs)
    
    
    class A(Hook, name="satori", age=16):
        pass
    """
    __init_subclass__ <class '__main__.A'> {'name': 'satori', 'age': 16}
    """
    

    首先我们定义了一个Hook类,然后让A这个类继承它。发现我们还没有没有实例化,而是在创建类的时候就有输出结果了。

    对于一个类,如果这个类被作为父类继承,那么会触发其内部的__init_subclass__方法,这里的Hook被A继承,那么Hook中的__init_subclass__就会被触发。而且看到,里面的cls,就是我们的A,也就是继承它的类,**kwargs,就是我们额外传递的参数。

    但是我们发现,第一个参数不是self,而是cls,而且这个cls还不是我们的Hook,而是继承它的类。其实这个方法是隐式的被classmethod装饰了

    用法

    有时候我们想控制类的生成过程,怎么办呢?显然可以通过元类的的方式,但是如果场景比较简单,也没必要使用元类。直接使用__init_subclass__即可

    class Hook:
    
        def __init_subclass__(cls, **kwargs):
            for k, v in kwargs.items():
                type.__setattr__(cls, k, v)
    
    
    class A(Hook, name="satori", age=16):
        pass
    
    
    print(A.name)  # satori
    print(A.age)  # 16
    

    可以看到,我们在不使用元类的情况下,通过__init_subclass__实现了类的自定义过程。当然这比较简单,也可以实现更复杂的逻辑,在某些场景下,可以替代元类。

  • 相关阅读:
    图像轮廓最大内接矩形的求法
    python利用sift和surf进行图像配准
    Faster Rcnn随笔
    opencv利用svm训练
    灰度图片均衡化源码
    彩色直方图(源码)
    Tensorflow内存暴涨问题
    C++写入txt
    C++生成dll以及调用(函数)和类
    列表元素的几种统计方法总结(嵌套列表)
  • 原文地址:https://www.cnblogs.com/traditional/p/11715511.html
Copyright © 2011-2022 走看看