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.

  • Guter Stil in Pythonobjekten
  • Python - warum "Selbst" in einer Klasse?
  • In Django, wie schreibe ich das für jede Funktion?
  • Eine Funktion aus der Klasse in python nennen - anders
  • Was ist eine Metaklasse in Python?
  • Iterate über Unterklassen einer gegebenen Klasse in einem gegebenen Modul
  • Allgemeines Befehlsmuster und Befehlsmuster in Python
  • Was ist der Vererben in Python?
  • UnicodeDecodeError: 'ascii' Codec kann das Byte 0xea nicht in Position 8 decodieren: ordinal nicht im Bereich (128)
  • Python - Klassen und OOP Grundlagen
  • Eigenes Verhalten der Klassen in Python
  • Python ist die beste Programmiersprache der Welt.