Избегать повторного использования медленной функции в классе Python - PullRequest
0 голосов
/ 16 марта 2019

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

Например, вот класс, в котором медленная функция вызывается следующими двумя функциями:

класс test_class:

    def __init__(self, A):
            self.a = A

    def some_function(self):
            """ Function to show that the slow function feeds of another function first """
            a = self.a
            a*=2
            return a

    def slow_function(self): 
            """ Imagine this is a very slow function """
            test_value = self.some_function()
            test_value*=2
            return test_value

    def using_slow_function(self): 
            """ Calls the very slow function and then operates on the output """
            b = self.slow_function()
            b *=2
            return b

    def using_slow_function_again(self):
            """ Calls the very slow function and then operates on the output """
            c = self.slow_function()
            c *= 2
            return c

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

Если вместо этого вывод slow_function можно превратить в атрибут, то это поможет, но я не уверен, как сделать это на полпути через класс.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 16 марта 2019

Вы можете назначить атрибуты в инициализированном объекте python в любое время.

Их не нужно делать при инициализации, и вы даже можете назначить их извне объекта.

>>> class A:
...     def __init__(self):
...         self.a = 1
...     def thing(self):
...         self.b = 2
... 
>>> c=A()
>>> c.a
1
>>> c.b
Traceback (most recent call last):
  module __main__ line 141
traceback.print_exc()
  module <module> line 1
c.b
AttributeError: 'A' object has no attribute 'b'
>>> c.thing()
>>> c.b
2
>>> c.c = 3
>>> c.c
3

РЕДАКТИРОВАТЬ: согласно комментарию @ roganjosh, вы можете назначить его как none во время инициализации.Мало того, что вы не получите AttributeError s, легче отслеживать все атрибуты.

>>> class A:
...     def __init__(self):
...         self.a = 1
...         self.b = None
...     def thing(self):
...         if self.b is None:
...             self.b = 2
... 
>>> c=A()
>>> c.b
None
>>> c.thing()
>>> c.b
2
>>> c.b = 3
>>> c.thing()
>>> c.b
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...