加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python中的__init_subclass__是什么?

发布时间:2020-12-20 10:14:31 所属栏目:Python 来源:网络整理
导读:什么是__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}""" 首先我们定义了一

什么是__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,age=16):
    pass


print(A.name)  # satori
print(A.age)  # 16

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读