Python-Klassen-Setup für die Serialisierung ohne Gurke

Szenario

Ich suche einen objektorientierten Ansatz in python, der es ermöglicht, eine Instanz einer Klasse in einer Datendatei zu speichern und sie auch zu einem späteren Zeitpunkt wieder einzuladen. Mein aktueller Ansatz sieht so aus:

class A(object): def __init__(self, ComplexParam1, ComplexParam2): self.ComplexParam1 = ComplexParam1 self.ComplexParam2 = ComplexParam2 @staticmethod def Create(EasyParam1, EasyParam2): #do some complex calculation to get ComplexParam1 and ComplexParam2 from EasyParam1 and EasyParam2 return A(ComplexParam1, ComplexParam2) def Save(self, Filename): #write ComplexParam1 and ComplexParam2 to disc @staticmethod def Load(Filename): #read ComplexParam1 and ComplexParam2 and call constructor return A(ComplexParam1, ComplexParam2) 

Wie Sie sehen können, sind ComplexParam1 und ComplexParam2 Parameter zu berechnen und werden nicht für eine erste Erstellung des Objekts A da sie sehr komplex sind, während EasyParam1 und EasyParam2 "bekannte" Parameter sind. Denken Sie daran, als ob die EasyParameters ganze Zahlen sind und die ComplexParameters sind große Matrizen, die auf Basis von EasyParameters

So verwende ich das Setup oben, Save Objekte auf und von Datei zu ComplexParam1 und zu ComplexParam2 , wobei Create den Konstruktor verwendet, da ComplexParam1 und ComplexParam2 in Datei gespeichert sind und nicht erneut berechnet werden müssen.

Problem

Bisher hat der oben gezeigte Ansatz für mich gut funktioniert. Probleme treten jedoch auf, wenn dieses Schema auch mit Klassenvererben verwendet wird. Also ich suche eine schönere und sauberere Lösung für mein Problem.

In C ++ würde ich den Konstruktor überladen und zwei mögliche Kreationen der Klasse zur Verfügung stellen, aber das wird in Python nicht unterstützt.

Jede Hilfe, Link und Vorschlag wird geschätzt.

2 Solutions collect form web for “Python-Klassen-Setup für die Serialisierung ohne Gurke”

Ich denke, das ist ein Fall für den @classmethod Dekorateur. Wenn Sie beispielsweise die Load Methode auf Folgendes ändern:

  @classmethod def Load(cls, Filename): # Do stuff return cls(ComplexA, ComplexB) 

Dann könntest du den Konstruktor überschreiben:

 class B(A): def __init__(self, complexA, complexB): # Whatever you want, including calling the parent constructor 

Und schließlich könntest du B.Load(some_file) anrufen, der B.__init__ .

Überlastung in nicht benötigt, verwenden Sie einfach ein classmethod für alternative contraftor Methoden. Betrachten Sie diese Fragen und es ist Antworten.

 class A (object): @classmethod def Load(cls, Filename): #read ComplexParam1 and ComplexParam2 and call constructor return cls(ComplexParam1, ComplexParam2) 

Mit dem cls-Parameter für die Klasse, funktioniert es gut mit Vererbung.

  • Überwindung von Pythons Einschränkungen hinsichtlich der Instanzmethoden
  • Python - sollten alle Membervariablen in __init__ initialisiert werden
  • Wie fange ich irgendeine Methode an, die ein Objekt in Python genannt wird?
  • Ist OOP sinnvoll für kleine Skripte?
  • OOP: gute Klasse Design
  • Übergeben einer Zython-Funktion vs eine Cython-Methode zu scipy.integrate
  • Wahlweise verwenden Dekorateure auf Klassenmethoden
  • Python OO Programmstrukturplanung
  • Was ist die __del__ Methode, wie man es nennt?
  • Spezielle Methode für ein Objekt, um Tupel-Erweiterung zu überschreiben?
  • Python: Soll ich eine Klasse oder ein Wörterbuch verwenden?
  • Python ist die beste Programmiersprache der Welt.