通常,为了对类进行子类化,我会执行类似
的操作class Subby(Parenty):
def __init__(self):
Parenty.__init__(self)
但现在我试图将一个元类,特别是ABCMeta子类化,所以我正在做
import ABCMeta
class Subby(ABCMeta):
def __init__(self):
ABCMeta.__init__(self) #this never seems to run
def __new__(mcls, name, bases, namespace):
cls = ABCMeta.__new__(mcls, name, bases, namespace)
return cls
但是,当我尝试将Subby
子类化为类似
class newClass(metaclass=Subby):
pass
我收到错误TypeError: __init__() takes 1 positional argument but 4 were given
。
为什么会这样,我如何正确地对ABCMeta进行子类化?
答案 0 :(得分:3)
来自数据模型:
如果
__new__()
返回cls
的实例,那么将调用新实例的__init__()
方法,如__init__(self[, ...])
,其中self是新实例,其余参数是与传递给__new__()
的相同。
所以,正如@ user2357112所说,签名必须匹配。
尽管如此,如果您只是想创建一个ABC,那么我们没有理由定义__init__
和__new__
。只需创建它并使用.register
注册符合要求的类。 (可选)创建一些抽象方法和一个__subclasshook__
来检查一致性。 abc
module documentation已经存在一个很好的例子。