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.
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)
Aber wenn ich versuche, es auszuführen:
Code: Select all
>>> fb = Foobar()
AttributeError: 'Foobar' object has no attribute 'foo'
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.