Как я могу повторно использовать возвращаемые значения в классе Python без повторного запуска функции каждый раз? - PullRequest
1 голос
/ 23 июня 2019

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

Спасибо!

class Test():

    def __init__ (self):
        # self.my_list = my_list()

        pass


    @staticmethod
    def my_list():
        set_list = [1, 2, 3, 4, 5, 6] 
        print ('you are not refrencing')

        return set_list

    @staticmethod
    def func_test():
        func_list = Test.my_list()
        return func_list


    @staticmethod
    def func_test2():
        func_list = Test.my_list()
        return func_list

    @staticmethod
    def print_func():
        print Test.my_list()
        print Test.func_test()
        print Test.func_test2()

        return

Test.print_func()

вот мой текущий результат:

you are not referencing 
[1, 2, 3, 4, 5, 6]
you are not referencing
[1, 2, 3, 4, 5, 6]
you are not referencing
[1, 2, 3, 4, 5, 6]

Я бы получил этот результатвместо

you are not referencing 
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]

Ответы [ 2 ]

3 голосов
/ 23 июня 2019

Если ваши функции pure (никакие побочные эффекты / одни и те же входы не всегда дают одинаковые выходы), вы можете использовать памятку с @functools.lru_cache, которая кэширует выходные данные для данногонабор входов.(Это опирается на dict, поэтому аргументы должны быть хешируемыми.)

Если функция не чистая (как ваш пример с вызовом print() внутри), то добавление этого декоратора изменит поведение:побочные эффекты будут пропущены при следующих вызовах.Также будьте очень осторожны, когда вы возвращаете изменяемое значение (например, список), потому что будет возвращен тот же кэшированный объект, даже если что-то изменило его, что может не соответствовать вашим ожиданиям.

0 голосов
/ 23 июня 2019
import functools

class Test():

    def __init__ (self):
        # self.my_list = my_list()

        pass


    @staticmethod
    @functools.lru_cache(maxsize=128, typed=False)
    def my_list():
        set_list = [1, 2, 3, 4, 5, 6] 
        print ('you are not refrencing')

        return set_list

    @staticmethod
    def func_test():
        func_list = Test.my_list()
        return func_list


    @staticmethod
    def func_test2():
        func_list = Test.my_list()
        return func_list

    @staticmethod
    def print_func():
        print (Test.my_list())
        print (Test.func_test())
        print (Test.func_test2())

        return

Test.print_func()

вы можете попробовать этот код, если вы в Python 2.7

from repoze.lru import lru_cache

@lru_cache(maxsize=500)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...