如何继承ABCMeta

时间:2017-05-08 23:10:10

标签: python python-3.x subclass metaclass

通常,为了对类进行子类化,我会执行类似

的操作
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进行子类化?

1 个答案:

答案 0 :(得分:3)

来自数据模型:

  

如果__new__()返回cls的实例,那么将调用新实例的__init__()方法,如__init__(self[, ...]),其中self是新实例,其余参数是与传递给__new__()的相同。

所以,正如@ user2357112所说,签名必须匹配

尽管如此,如果您只是想创建一个ABC,那么我们没有理由定义__init____new__。只需创建它并使用.register注册符合要求的类。 (可选)创建一些抽象方法和一个__subclasshook__来检查一致性。 abc module documentation已经存在一个很好的例子。