【发布时间】:2018-10-12 17:12:22
【问题描述】:
我正在尝试让类装饰器工作。装饰器会将__init_subclass__ 方法添加到它所应用到的类中。
但是,当方法被动态添加到类时,第一个参数不会绑定到子类对象。为什么会这样?
作为一个例子:这是可行的,下面的静态代码是我试图最终得到的一个例子:
class C1:
def __init_subclass__(subcls, *args, **kwargs):
super().__init_subclass__(*args, **kwargs)
print(f"init_subclass -> {subcls.__name__}, {args!r}, {kwargs!r}")
测试:
>>> D = type("D", (C1,), {})
init_subclass -> D, (), {}
但是,如果我动态添加 __init__subclass__ 方法,则子类不会绑定到第一个参数:
def init_subclass(subcls, **kwargs):
super().__init_subclass__(**kwargs)
print(f"init_subclass -> {subcls.__name__}, {args!r}, {kwargs!r}")
def decorator(Cls):
Cls.__init_subclass__ = init_subclass
return Cls
@decorator
class C2:
pass
测试:
>>> D = type("D", (C2,), {})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: init_subclass() missing 1 required positional argument: 'subcls'
为什么会发生这种情况,我怎样才能做到这一点并让绑定以正确的方式工作?
【问题讨论】:
标签: python python-3.x metaprogramming