Ich definiere mehrere Klassen, die für die Mehrfachvererbung verwendet werden sollen, z. B.:
class A:
def __init__(self, bacon = None, **kwargs):
self.bacon = bacon
if bacon is None:
self.bacon = 100
super().__init__(**kwargs)
class Bacon(A):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
class Eggs(A):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
class Spam(Eggs, Bacon):
def __init__(self, **kwargs):
"""Optional: bacon"""
super().__init__(**kwargs)
Ich habe jedoch mehrere Klassen (z. B. möglicherweise Bacon
, A
y Spam
, aber nicht Eggs
), die sich darum kümmern, wann ihr Eigentum bacon
geändert wird. Sie brauchen den Wert nicht zu ändern, sondern nur zu wissen, wie der neue Wert lautet, wie ein Ereignis. Aufgrund der Mehrfachvererbung, die ich eingerichtet habe, würde dies bedeuten, dass die Superklasse über die Änderung benachrichtigt werden muss (sofern sie sich dafür interessiert).
Ich weiß, dass es möglich sein könnte, wenn ich den Klassennamen an den Methodendekorator übergebe oder wenn ich einen Klassendekorator verwende. Ich möchte nicht die ganze direkte Selbst-Klassen-Referenzierung haben, viele Dekoratoren über jeder Klasse erstellen müssen, oder die Methoden zwingen, den gleichen Namen zu haben, da nichts davon sehr pythonisch klingt.
Ich hatte gehofft, eine Syntax zu erhalten, die in etwa so aussieht:
@on_change(bacon)
def on_bacon_change(self, bacon):
# read from old/new bacon
make_eggs(how_much = bacon)
Mir ist der vorherige Wert von bacon
so dass das Speck-Argument nicht notwendig ist, wenn es nach bacon
eingestellt ist.
-
Ist es möglich, zu prüfen, ob eine Superklasse eine Methode mit dieser Dekator hat?
-
Wenn dies nicht möglich ist, gibt es Alternativen zur Weitergabe von Ereignissen wie durch die Kette der Mehrfachvererbung weiterzugeben?
EDITAR:
Der eigentliche Aufruf der Funktion in Spam würde in A erfolgen, indem man eine @property
y @bacon.setter
da dies die oberste Klasse sein würde, die die bacon
. Sobald es weiß, welche Funktion es aufzurufen hat self
liegt das Problem nur in der Weiterleitung des Aufrufs in der MI-Kette.
EDIT 2:
Überschreibe ich das Attribut mit einer @bacon.setter
Wäre es möglich, festzustellen, ob die Klasse super() einen Setter für bacon
?