Динамически устанавливаемый атрибут экземпляра в Python - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть класс с двумя атрибутами экземпляра. Например:

class Test(): 
    def __init__(self, parameter):
        self.one = self.somefunction(parameter)
        self.two = 'somestring'

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

def somefunction(parameter):
    return ...

Однако, это не лучшая практика. Каков наилучший способ динамического задания начального значения экземпляра?

1 Ответ

0 голосов
/ 09 сентября 2018

Нет ничего плохого в том, что вы сделали, если somefunction не займет много времени, чтобы вернуться.Как правило, вы обычно не хотите, чтобы создание / создание объекта занимало много времени.Если для вычисления этого атрибута требуется много времени, вы должны сделать это при первом обращении к атрибуту.И это можно сделать с помощью методов получения свойств.

import time

class Foo(object):

    def __init__(self, parameter):
        self._one = None
        self.two = "some_string"
        self._parameter = parameter

    @property
    def one(self):
        if self._one is None:
            self.one = self._some_method()
        return self.one

    def some_method(self):
         time.sleep(10)
         return sorted(self._parameter)

При вызове foo.one Python проверит, является ли атрибут "protected" по-прежнему None.Если это так, , то вызовет дорогой вызов функции.При следующей попытке доступа к нему будет использовано сохраненное значение.

...