通常,要对类进行子类划分,我会执行如下操作

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中。

08-03 11:54