python TypeError: __new__() 缺少 1 个必需的位置参数:'namespace'

mod*_*kzs 7 python python-3.x

我尝试使用初始化类

tsf = TimeSeriesFeature(cut_avg, interval)

但我得到了 TypeError: __new__() 缺少 1 个必需的位置参数:'namespace'。

TimeSeriesFeature的初始化代码如下:

class TimeSeriesFeature(BasicFeature):
    def __init__(self, cut_avg, interval):
        super().__init__()
        self.cut_avg = cut_avg
        self.interval = interval
        self.get_avg()
Run Code Online (Sandbox Code Playgroud)

和 BasicFeature 初始化代码:

class BasicFeature(ABCMeta):
    def __init__(self):
        self.times = {}
        self.avg = {}
Run Code Online (Sandbox Code Playgroud)

我正在使用python3.5。有没有什么错误?

mbd*_*vpl 6

您得到的错误是由于元类的实例化不使用它的__init__方法,而是它的__new__方法(不包括 self)需要 3 个参数,最后一个参数是namespace

就目前情况而言,您的类继承自ABCMeta(这是一个元类),因此它也是一个元类:

class BasicFeature(ABCMeta):
    ...
Run Code Online (Sandbox Code Playgroud)

但我认为你宁愿设置ABCMeta为你的类的元类:

class BasicFeature(metaclass=ABCMeta):
    ...
Run Code Online (Sandbox Code Playgroud)

这样你的类就成为一个普通的类,因为ABCMeta它是元类。

如果您想BasicFeature成为一个抽象(换句话说,无法初始化)类,请向其添加一个抽象方法,如下所示:

class BasicFeature(metaclass=ABCMeta):

    @abstractmethod
    def get_avg():
        pass
Run Code Online (Sandbox Code Playgroud)

并在没有装饰器的子类中重载它@abstractmethod

class TimeSeriesFeature(BasicFeature):

    def get_avg():
        # ... some code
        # ... some code
Run Code Online (Sandbox Code Playgroud)

然后,尝试实例化的用户BasicFeature将收到有关抽象的错误get_avg(),但实例化的用户TimeSeriesFeature不会。文档中提供了更多详细信息