在创建 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
装饰器。
我有一个 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
装饰器。