Python-Initialisierung mit Mehrfachvererbung
Posted: 12 Jan 2025, 10:50
Ich habe die folgende Klassenhierarchie. Das Ziel besteht darin, dass der aufrufende Code entweder ein Basis-Foo-Objekt oder ein Foobar-Objekt auswählt, das auch die zusätzliche Bar-Funktionalität bereitstellt.
Aber wenn ich versuche, es auszuführen:
Wie initialisiert man Foobar richtig? Ich habe eine Reihe von Artikeln und SO-Beiträgen über die Initialisierung mit Mehrfachvererbung gelesen, aber keinen, in dem ein Basiskonstruktor eine Eigenschaft der anderen Basisklasse erfordert.
BEARBEITEN:Mein tatsächlicher Anwendungsfall ist abgeleitet von https://www.pythonguis.com/tutorials/py ... atplotlib/. "" ist eigentlich FigureCanvasQTAgg und "" entspricht MplCanvas. Foobar muss von FigureCanvasQTAgg abgeleitet sein, da das Foobar-Objekt an eine Reihe von PySide6-Code übergeben wird, der Attribute verwendet, die ich nicht verwende Ich versuche, den regulären matplotlib-Code in eine andere Basisklasse aufzuteilen (), damit ich ein alternatives Frontend erstellen kann, das PySide6 nicht verwendet, aber es gibt möglicherweise einen anderen Weg, dieses Ziel zu erreichen.
BEARBEITEN 2:
Sieht so aus, als ob der gesamte Ansatz fehlerhaft sein könnte. Es wäre für mein kleines Gehirn sicherlich weniger anstrengend, foo in einer separaten Funktion zu erstellen, bevor ich versuche, entweder ein Foo oder eine Foobar zu instanziieren.
Code: Select all
class Foo:
def __init__(self):
self.foo = 'foo'
class Bar:
def __init__(self, attr):
self.attr = attr
def bar(self):
print(self.attr + 'bar')
class Foobar(Foo, Bar):
def __init__(self):
super().__init__(self.foo)
Code: Select all
>>> fb = Foobar()
AttributeError: 'Foobar' object has no attribute 'foo'
BEARBEITEN:Mein tatsächlicher Anwendungsfall ist abgeleitet von https://www.pythonguis.com/tutorials/py ... atplotlib/. "
Code: Select all
Bar
Code: Select all
Foobar
Code: Select all
Foo
BEARBEITEN 2:
Sieht so aus, als ob der gesamte Ansatz fehlerhaft sein könnte. Es wäre für mein kleines Gehirn sicherlich weniger anstrengend, foo in einer separaten Funktion zu erstellen, bevor ich versuche, entweder ein Foo oder eine Foobar zu instanziieren.