通常,要对一个类进行子类化,我会做类似的事情
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 __()接受1个位置参数,但给出了4个.
这是为什么,以及如何继承ABCMeta是否正确?
解决方法:
从数据模型:
If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().
因此,正如@ user2357112所说,签名必须匹配.
尽管如此,如果您只是想创建一个ABC,实际上没有理由定义__init__和__new__.只需创建它,然后使用.register注册符合条件的类. (可选)创建多个抽象方法和一个用于检查一致性的__subclasshook__. abc module documentation中已经存在一个很好的例子.
标签:python-3-x,subclass,metaclass,python
来源: https://codeday.me/bug/20191111/2019550.html