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

标签 python abstract-class class-method

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

这是我的代码的原型(prototype):

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

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

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

编辑:根据@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 等交互的接口(interface)类。

最佳答案

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

关于python - 我们可以从没有实例化的类中调用方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172114/

相关文章:

python - 来自太阳的运动检测照明

python - 在 python 中使用负数

python - 如何使用 python-decorator 包来装饰类方法?

objective-c - 静态/类方法存储在 objective-c 中的位置

ruby - 为什么在类上调用 instance_eval() 时定义类方法?

python - 平面拟合到 4 个(或更多)XYZ 点

python - 仅将字符串拆分为两部分

grails - 我可以在Grails中为抽象域类自定义列名吗?

c++ - 在 QML 插件中注册一个 C++ 抽象类并从 QML 中引用它

java - 子类不能调用父类的public方法