2017-02-09 1 views
0

Ich habe eine Klasse, wo die gemeinsame Variable self.a nach einer sehr schweren Berechnung erhalten wird, die viel Zeit erfordert:Wird die Eigenvariable mehrmals berechnet, wenn Funktionen in Python mehr als einmal aufgerufen werden?

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) 

Wie Sie sehen können, self.a durch die Funktionen verwendet wird fun1 und fun2. Hier ist meine Frage: Wenn ich diese 2 Funktionen anrufe, wird die demanding_function() mehrfach oder nur einmal ausgeführt?

Hinweis: Dies ist ein allgemeines Beispiel und die Variablen haben keine spezielle Bedeutung

+0

Nein. Say 'fordernd_funktion()' gibt 1 aus 'out == 1' und daher 'self.a == 1'. Von nun an wird, wenn Sie seine Methoden für die Instanz verwenden, einfach der Wert verwendet, der in 'self.a' gespeichert ist. Das ist 1. Solange Sie keine Instanz initialisieren, wird die Methode' __init__' niemals ausgeführt. – spicypumpkin

Antwort

2

Die Funktion nur einmal aufgerufen wird, wenn die Klasseninstanz heißt initialisiert wird, wenn die __init__ der Klasse aufgerufen wird. Bei jedem weiteren Zugriff auf self.a wird der bereits zugewiesene Wert verwendet. also keine Sorgen.

+0

Danke für die Antwort :) noch eine Kuriosität: Lass uns so tun, als ob ich ein Paket erstelle, wo ich in der Datei __init__.py andere Funktionen (fun3, fun4 ...) habe, die fun1 und fun2 aufrufen ... ist die slef-Variable immer noch einmal ausgeführt? Hoffentlich macht die Frage Sinn ... –

+0

Die Selbstvariable ist eine Instanz der Klasse, ich bin mir nicht sicher, was Sie unter * ausgeführt * verstehen. Wenn sich die Funktionen in "__init__" befinden, werden sie nur aufgerufen, wenn die Klasse instanziiert wird. –

+0

Entschuldigung, ich meinte die fordernde_funktion(), die den Wert in selbst gespeichert zu berechnen ... –

2

__init__ wird nur einmal aufgerufen, wenn Sie das Objekt instanziieren. Alle nachfolgenden Methodenaufrufe, die dieses instanziierte Objekt verwenden, verwenden die bereits berechneten Werte von instance varaibles

+0

Danke für die Antwort :) eine weitere Kuriosität: Lass uns so tun, ich ein Paket erstellen, wo in der __init__.py-Datei habe ich andere Funktionen (fun3, fun4 ...) welche fun1 und fun2 aufrufen ... ist die slef-Variable noch einmal ausgeführt? Hoffentlich macht die Frage Sinn ... –

+0

@FedericoGentile ja, solange Sie nicht die gleiche Instanz neu initiieren. Das 'self', welches einer Ihrer Parameter ist, ist * wirklich * kein Parameter - es teilt der Funktion nur mit, initiierte Attribute der Instanz zu verwenden, die 'self' entsprechen. – spicypumpkin

+0

Entschuldigung wegen meiner Ignoranz, aber was bedeutet es, die gleiche Instanz in der Praxis erneut zu initiieren? –

Verwandte Themen