我们可以从没有实例化的类中调用方法吗

时间:2019-05-16 15:35:47

标签: python abstract-class class-method

我想问一下是否有一种方法可以在类中实现不实例化的接口方法,或者甚至更多,如果这完全是一种不好的做法?如果是这样,实现复杂接口方法的正确方法是什么?

这是我的代码的原型:

class calculator(abc.ABC):

    @abc.abstractmethod
    def calculate(self):
        "start model"

class subcalculator(calculator):
    def calculate(self):
        return model.attr2 ** 3

    def recalculate(self):
        z = calculate(self)
        return z ** 2

但是,运行calculate()时未定义此报告subcalculator.recalculate,因为它没有实例化。

由于我只是为模型编写接口类,所以我认为编写启动不是一个好主意。(或者是?)在这种情况下应该怎么做?

编辑:根据@chepner的回答,我还想出了一些解决该问题的方法,但我不确定这是否正确:

    @classmethod
    def recalculate(cls, self):
        z = cls.calculate(self)
        return z ** 2

另外,值得一提的是结构的对象/模型部分:

#In model.py

class model(object):
    def __init__(self, attr1):
        self.attr1 = attr1

class submodel(model):
    def __init__(self, attr1, attr2):
        super().__init__(attr1)
        self.attr2 = attr2

所以我希望将calculator编写为可以与model等交互的接口类。

1 个答案:

答案 0 :(得分:2)

calculate是一种无论您是否创建实例的方法,都必须这样。

class subcalculator(calculator):
    def calculate(self):
        return model.attr2 ** 3

    def recalculate(self):
        z = subcalculator.calculate(self)
        return z ** 2

当然,最好让继承模型确定需要调用哪个calculate方法:

def recalculate(self):
    z = self.calculate()
    return z ** 2