我正在尝试使用 python 3.6 的新功能__init_subclass__
特征 (PEP 487 https://www.python.org/dev/peps/pep-0487/)与abc
模块。它似乎不起作用。以下代码:
from abc import ABCMeta
class Initifier:
def __init_subclass__(cls, x=None, **kwargs):
super().__init_subclass__(**kwargs)
print('got x', x)
class Abstracted(metaclass=ABCMeta):
pass
class Thingy(Abstracted, Initifier, x=1):
pass
thingy = Thingy()
运行时产生以下结果:
Traceback (most recent call last):
File "<filename>", line 10, in <module>
class Thingy(Abstracted, Initifier, x=1):
TypeError: __new__() got an unexpected keyword argument 'x'
如果 Abstracted 不使用,一切都会正常工作ABCMeta
元类。
此错误具有相当的弹性,例如,以下代码仍然会失败并出现类似的类型错误(大概是因为元类'__new__
在类实例化时运行,而父类'__new__
在对象实例化之前不会运行)。
from abc import ABCMeta
class Initifier:
def __new__(cls, name, bases, dct, x=None, **kwargs):
return super().__new__(cls, name, bases, dct, **kwargs)
def __init_subclass__(cls, x=None, **kwargs):
super().__init_subclass__(**kwargs)
print('got x', x)
class Abstracted(metaclass=ABCMeta):
pass
class Thingy(Initifier, Abstracted, x=1):
pass
thingy = Thingy()
谁能确认这是 Python 3.6 中的一个错误abc
模块和/或__init_subclass__
执行? (我可能正在使用__init_subclass__
错误。)有人有解决方法吗?