我尝试使用python3.6的新的__init_subclass__
特性(PEP 487)和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()
运行时产生以下结果:
^{pr2}$如果Abstracted不使用ABCMeta
元类,则一切正常。在
{{cd4>在实例化一个类之前,{cd4>仍然会失败,因为在实例化一个类之前,{cd4>仍然会出现类似的错误。在
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()
有人能确认这是Python3.6abc
模块和/或__init_subclass__
实现中的一个bug吗?(我可能用错了__init_subclass__
)有人有解决办法吗?在
这是}的设计中有一个缺陷。我建议上报。在
abc.ABCMeta
中的一个缺陷,因为{现在几乎所有存在的元类都应该将意外的关键字参数传递给
super().__new__
,这样type.__new__
可以将它们传递给__init_subclass__
,但是ABCMeta和其他很多元类可能还没有做到这一点。abc.ABCMeta.__new__
阻塞了x
关键字参数,而不是传递它,从而导致您看到的异常。在尝试将
__init_subclass__
关键字参数与尚未为新设计更新的元类一起使用是行不通的。您必须等待您使用的元类被修补。在相关问题 更多 >
编程相关推荐