通常,要对类进行子类划分,我会执行如下操作
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子类化?
最佳答案
从数据模型:
如果__new__()
返回cls
的实例,则新实例的__init__()
方法将像__init__(self[, ...])
一样被调用,其中self是新实例,其余参数与传递给__new__()
的参数相同。
因此,正如@user2357112所说,签名必须匹配。
尽管如此,如果您只是想创建一个ABC,实际上没有理由定义__init__
和__new__
。只需创建它并使用.register
来注册一致性类或者,创建一些抽象方法和检查一致性的__subclasshook__
一个很好的例子已经存在于abc
module documentation中。