Python Can';在创建类之后,不要添加`\uuuu init\u子类`

Python Can';在创建类之后,不要添加`\uuuu init\u子类`,python,python-3.8,Python,Python 3.8,我有一个类装饰器,它应该添加一个\uuuu init\u subclass\uuuu方法,但是当我这样做时: A类: 定义初始子类(cls,**kwargs): 打印(cls) B类: 通过 def p(cls,**kwargs): 打印(cls) B.。uuu init_子类_uuu=p C(A)类: 通过 #打印C类 D(B)类: 通过 #TypeError:p()缺少1个必需的位置参数:“cls” 区别似乎在于A.uu init\u subclass\uuu是类A的绑定方法,而p只是一个

我有一个类装饰器,它应该添加一个
\uuuu init\u subclass\uuuu
方法,但是当我这样做时:

A类:
定义初始子类(cls,**kwargs):
打印(cls)
B类:
通过
def p(cls,**kwargs):
打印(cls)
B.。uuu init_子类_uuu=p
C(A)类:
通过
#打印C类
D(B)类:
通过
#TypeError:p()缺少1个必需的位置参数:“cls”
区别似乎在于
A.uu init\u subclass\uuu
是类A的绑定方法,而p只是一个函数。但是类A的方法是如何绑定到新的子类的呢?在类上下文退出之前,这个子类根本不存在?使用
B将p绑定到B.。\uuuu init\u子类\uuuu。\uuuu get\uuuu(B)
会导致
cls
参数等于B本身,而不是像神奇绑定的
A.\uuuu init\u子类那样等于新的子类。


在创建类之后,我如何执行Python自己所做的同样的魔术?

\uuuu init\uuu子类
需要是一个类方法
type.\uuuu new\uuuuuu
自动将
\uuuu init\u subclass\uuuuu
作为类方法,如果它在类创建时是一个常规函数,但如果您稍后添加
\uuuuu init\u subclass\uuuuu
,则不会发生这种情况


如果在创建类后添加
\uuuu init\u子类
,则需要自己添加
@classmethod
装饰器。

有趣且正确!你能在回答中解释一下
A.\uuuu init\u subclass\uuuu=A.\uuuu init\u subclass\uuuuu.\uu get\uuuu(A)
类方法
装饰器之间的区别吗?我总是假设classmethoddecorator绑定该方法所定义的类。它如何绑定子类?我假设classmethoddecorator返回一个带有特殊描述符协议的对象?