在创建 class 后无法添加 `__init_subclass__`

Can't add `__init_subclass__` after class has been created

我有一个 class 装饰器,它应该添加一个 __init_subclass__ 方法,但是当我这样做时:

class A:
 def __init_subclass__(cls, **kwargs):
  print(cls)

class B:
 pass

def p(cls, **kwargs):
 print(cls)

B.__init_subclass__ = p

class C(A):
 pass

# Prints class C

class D(B):
 pass

# TypeError: p() missing 1 required positional argument: 'cls'

区别似乎是A.__init_subclass__是classA的绑定方法,而p只是一个函数。但是 class A 的方法如何绑定到新的 subclass ,而在 class 上下文退出之前甚至不存在?使用 B.__init_subclass__.__get__(B) 将 p 绑定到 B 会导致 cls 参数等于 B 本身,而不是像神奇绑定 A.__init_subclass__[ 那样绑定到新的 subclass =18=]

在创建 class 之后,我如何才能施展与 Python 相同的魔法?

__init_subclass__ 需要是 class 方法。 type.__new__ 自动使 __init_subclass__ 成为 class 方法,如果它是 class 创建时的常规函数​​,但如果您稍后添加 __init_subclass__,则不会发生这种情况。

如果在创建class后添加__init_subclass__,则需要自己添加@classmethod装饰器。