Можем ли мы вызвать метод из класса без экземпляров - PullRequest
1 голос
/ 16 мая 2019

Я хотел бы спросить, есть ли способ реализовать интерфейсный метод внутри класса без создания экземпляров или даже больше, если это вообще плохая практика?Если это так, каков будет правильный способ реализации сложного метода интерфейса?

Вот прототип моего кода:

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, так как он не создан.

Поскольку я просто пишу интерфейсные классы для своей модели, я полагаю, что написание инициации не является хорошей идеей. (Или это так?) Что мне делать в таком случаеcase?

Редактировать: Согласно ответу @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 Ответ

2 голосов
/ 16 мая 2019

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
...