Python Klassenhierarchien: Basis-Klasse parametrisieren?



  • Hi!

    Vllt. treiben sich hier ja einige Pythonistas rum 🙂 Ich habe folgendes Problem: ich hab Code geschrieben, der einige Berechnungen durchfuehrt. Es gibt Klases mit der Grundimplementierung mit NumPy, und eine optimierte Implementierung, welche auf der GPU rechnet.

    Die optimierte Implementierung leite ich von der NumPy-Implementierung ab, damit ich einige Komfortfunktionen zum Laden, Speichern und Darstellen der Ergebnisse/Parameter nicht duplizieren muss.

    Nun moechte ich eine erweiterte Version meines Algorithmus implementieren. Es soll wieder eine Basis-Implementierung mit NumPy geben und eine erweiterte Implementierung fuer die GPU:

    In Pseudocode:

    class NumpyBase:
        # Basisimplementierung mittels numpy
        # ....
    
    class GpuBase(NumpyBase):
        # gleicher Algorithmus wie NumpyBase, aber auf der GPU
        # ...
    
    class NumpyExtended(NumpyBase):
        # Erweiterte Version mittels Numpy
        # ...
    
    class GpuExtended(GpuBase):
        # ist 100%ig ident mit NumpyExtended.
        # .....
    

    Ich habe jetzt folgendes Problem: GpuExtended und NumpyExtended sind zu 100% identisch. Zeichen fuer Zeichen. Dadurch, dass sie verschiedene Eltern-Klassen haben, rechnet die eine aber auf der GPU und die andere auf der CPU. Zwei mal den gleichen Code zu warten ist natuerlich nicht sinnvoll.

    Ich moechte das Ganze daher nach Moeglichkeit so loesen, dass ich nur mehr EINE Klasse "Extended" habe, und der irgendwie sagen kann "verwende GpuBase bzw. NumpyBase als deine Basisklasse".

    Geht das Irgendwie?



  • Wie wärs damit:

    def class_factory(base):
        class ExtendedTemplate(base):
            # Erweiterte Version
        return ExtendedTemplate
    
    NumpyExtended = class_factory(NumpyBase)
    GpuExtended = class_factory(GpuBase)
    


  • Komposition statt Vererbung ⚠



  • Geloest mittels einer Mixin-Klasse 🙂


Anmelden zum Antworten