Как передать возвращаемое значение метода в классе? - PullRequest
2 голосов
/ 05 марта 2020

Как правильно передать возвращаемое значение из метода в классе? Вы всегда вызываете метод, когда это необходимо, или возвращаемое значение можно сохранить в методе init? Допустим, у меня есть:

class Foo():

    def __init__(self):

    def heavy_method(self):
        #slow crunching
        return crunch

    def use_heavy_crunch(self):
        data = self.heavy_crunch()
        for i in data:
            #do data stuff
            #return data stuff

    def other_func_that_need_heavy_method(self):
        pass

d = Foo()
d.use_heavy_crunch()

Что мне интересно, так это то, что вышеприведенная структура является правильным способом или эквивалентен или лучше следующий путь?

class Foo()

    def __init__(self):
        self.data = None

    def heavy_method(self):
        #slow crunching
        self.data = crunch

    def use_heavy_crunch(self):
        for i in self.data:
            #do data stuff
            #return data stuff

    def other_func_that_need_heavy_method(self):
        pass

d = Foo()
d.heavy_method()
d.use_heavy_crunch()

Таким образом, в приведенном выше примере метод вызывается в другом методе, а в приведенном ниже примере возвращаемое значение метода передается переменной в методе init, а затем используется в другой функции.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы не хотите, чтобы метод инициализации класса выполнял тяжелые задачи обработки, это обычно плохая практика, инициализация класса должна использоваться только для инициализации переменной экземпляра на основе класса. Если вы планируете вызывать d.use_heavy_crunch() несколько раз в будущем после создания экземпляра d, а возвращаемое значение d.heavy_method() не изменилось с течением времени, тогда второй подход является хорошим способом go, как в случае Первый подход каждый раз, когда вы звоните d.use_heavy_crunch(), вы звоните d.heavy_method() и выполняете одни и те же задачи повторно. Во втором подходе вы вызываете d.heavy_method() только один раз, а затем используете его результат в других методах класса.

1 голос
/ 05 марта 2020

Если я правильно понимаю, вы пытаетесь сделать что-то вроде

class Foo():

    def __init__(self):
        self.data = self.heavy_method() # we assign the return value to an attribute of our object

    def heavy_method(self):
        #slow crunching
        return crunch

    def use_heavy_crunch(self):
        for i in self.data: # Notice it's now self.data
            #do data stuff
            #return data stuff

    def other_func_that_need_heavy_method(self):
        pass

d = Foo()
d.use_heavy_crunch()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...