Ich schreibe einen Code, der einen Dateinamen annimmt, die Datei öffnet und einige Daten analysiert. Ich würde das gerne in einer Klasse machen. Der folgende Code funktioniert:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
parse_file()
Aber ich muss die gesamte Parsing-Maschinerie in den __init__
Funktionsumfang meiner Klasse aufnehmen. Für diesen vereinfachten Code sieht das jetzt gut aus, aber die Funktion parse_file
weist auch einige Einrückungsstufen auf. Ich würde es vorziehen, die Funktion parse_file()
wie folgt als Klassenfunktion zu definieren :
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
parse_file()
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
Natürlich funktioniert dieser Code nicht, da die Funktion parse_file()
nicht im __init__
Funktionsumfang liegt. Gibt es eine Möglichkeit, eine Klassenfunktion innerhalb __init__
dieser Klasse aufzurufen ? Oder denke ich falsch darüber nach?
Antworten:
Rufen Sie die Funktion folgendermaßen auf:
Sie müssen Ihre parse_file () -Funktion auch folgendermaßen definieren:
Die
parse_file
Methode muss beim Aufruf an ein Objekt gebunden werden (da es sich nicht um eine statische Methode handelt). Dies erfolgt durch Aufrufen der Funktion für eine Instanz des Objekts, in Ihrem Fall für die Instanzself
.quelle
Wenn ich mich nicht irre, sind beide Funktionen Teil Ihrer Klasse. Sie sollten sie folgendermaßen verwenden:
Ersetzen Sie Ihre Leitung:
mit:
quelle
self.parse_file()
und nichtparse_file()
?def parse_file(self):
nicht unter der__init__
Funktion verschachtelt sein, damit Sie kein teilweise initialisiertes Objekt haben?Wie wäre es mit:
Übrigens, wenn Sie Variablen usw. benannt
stat1
habenstat2
, bittet die Situation um ein Tupel :stats = (...)
.Lassen Sie also
parse_file
ein Tupel zurückgeben und das Tupel darin aufbewahrenself.stats
.Dann wird zum Beispiel, können Sie was Zugriff verwendet aufgerufen werden ,
stat3
mitself.stats[2]
.quelle
parse_file
Funktion eine Methode desMyClass
Objekts sein soll? Wo wäreself
das nötig?In
parse_file
nehmen Sie dasself
Argument (wie in__init__
). Wenn Sie einen anderen Kontext benötigen, übergeben Sie ihn wie gewohnt als zusätzliche Argumente.quelle
Sie müssen parse_file wie folgt deklarieren.
def parse_file(self)
. Der Parameter "self" ist in den meisten Sprachen ein versteckter Parameter, in Python jedoch nicht. Sie müssen es der Definition aller Methoden hinzufügen, die zu einer Klasse gehören. Dann können Sie die Funktion von jeder Methode innerhalb der Klasse mit aufrufenself.parse_file
Ihr endgültiges Programm wird folgendermaßen aussehen:
quelle
Ich denke, dass Ihr Problem tatsächlich darin besteht, die Init- Funktion nicht richtig einzurücken. Es sollte so sein
quelle
@staticmethod
Dekorateur daraufparse_file
self
in Ihrerparse_file
Methode hinzu.