2017-05-08 74 views
2

通常情况下,子类一类我这样做如何继承ABCMeta

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?

+3

'__init__'需要采用'__new__'相同的参数。 – user2357112

+0

你可以自己实例化Subby吗? –

+0

'ABCMeta'是'abc.ABCMeta'类还是另一个在另一个模块中定义的类? – slackmart

回答

3

从数据模型:

如果__new__()回报cls一个实例,则新实例的__init__()方法将被调用像__init__(self[, ...]),其中self是新实例,其余参数都一样被传递到__new__()

因此,如@ user2357112所示,的签名必须匹配

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

+0

对于欢呼的巧合,我刚刚写了一个答案,其中我实际上是_did_子类ABCMeta,出于某种目的。 (我以前没有见过这个问题)。我可能是这个问题的一个很好的例子 - http://stackoverflow.com/a/43884960/108205 – jsbueno