2017-02-09 15 views
0

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

class MyClass(object): 
def __init__(self): 
    # ---------------------------------- 
    # function computationally demanding 
    out = demanding_function() # In this example, the output is a list of characters ['A','X','R','N','L'] 
    # ---------------------------------- 
    self.a = out 

def fun1(self, string): 
    out = [] 
    for letter in self.a: 
     out.append(string+letter) 
    return out 

def fun2(self, number): 
    out = [] 
    for letter in self.a: 
     out.append(str(number)+letter) 
    return out 

o = MyClass() 
x = o.fun1('Hello ') 
y = o.fun2(2) 

Как вы можете видеть, self.a используется функциями fun1 и fun2. Вот мой вопрос: если я называю эти 2 функции, выполняется ли demanding_function() несколько раз или только один раз?

Примечание: это общий пример и переменные не имеют какого-либо конкретного значения

+0

Нет. Скажем, 'requireing_function()' возвращает 1. 'out == 1' и, следовательно,' self.a == 1'. С этого момента всякий раз, когда вы используете свои методы в экземпляре, он просто использует значение, хранящееся в 'self.a', которое равно 1. Если вы не инициализируете экземпляр, метод' __init__' никогда не выполняется. – spicypumpkin

ответ

2

функция вызывается только один раз, когда экземпляр класса инициализируется, т.е. когда __init__ класса называется. Каждый раз, когда вы получаете доступ к self.a, используется уже присвоенное значение; так что не беспокойтесь.

+0

Спасибо за ответ :) еще одно любопытство: давайте притворимся, что создаю пакет, где в файле __init__.py у меня есть другие функции (fun3, fun4 ...), которые вызывают fun1 и fun2 ... это переменная slef один раз? Надеюсь, вопрос имеет смысл ... –

+0

Самопеременная - это экземпляр класса, я не уверен, что вы подразумеваете под * выполняемым *. Если функции находятся в '__init__', то они вызываются только при создании экземпляра класса. –

+0

Извините, что я имел в виду функцию requireing_function(), которая вычисляет значение, которое будет храниться в self ... –

2

__init__ вызывается только один раз, когда вы создаете экземпляр объекта. Любые последующие вызовы методов, использующие этот экземпляр-объект, будут использовать уже вычисленные значения экземпляра varaibles

+0

Спасибо за ответ :) еще одно любопытство: давайте притворимся, что создаю пакет, где в файле __init__.py есть другие функции (fun3, fun4 ...), которые вызывают fun1 и fun2 ... - это переменная slef, которая все еще выполняется один раз? Надеюсь, вопрос имеет смысл ... –

+0

@FedericoGentile да, до тех пор, пока вы не запускаете один и тот же экземпляр. «Self», который является одним из ваших параметров, не является * действительно * параметром, он просто говорит функции использовать начальные атрибуты экземпляра, который равен «самому». – spicypumpkin

+0

сожалею о моем невежестве, но что значит повторно инициировать один и тот же пример на практике? –