Sagen, ich habe diese Klasse:Anfügen an eine Mitgliederliste, wenn in Python Subklassen
class FooClass(object):
foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
# ...
Ich möchte ein SpecialisedFooClass für diese Klasse zu schaffen, die FooClass
erstreckt, das Hinzufügen eines Elements "spec"
-foos
(dh so dass foos
enthält ["foo", "bar", "spec"]
).
SpecialisedFooClass.foos
sollte auf FooClass.foos
abhängig: Wenn ich FooClass
'Definition ändern, so dass foos
enthält ["foo", "bam", "bat"]
, SpecialisedFooClass.foos
sollte dann ["foo", "bam", "bat", "spec"]
enthalten.
Dies ist die beste Art, wie ich mit so weit habe kommen:
class SpecialisedFooClass(FooClass):
foos = FooClass.foos + ["spec"]
Aber ich finde die ausdrückliche Bezugnahme auf FooClass
über. Wenn ich beschließe, eine Zwischenunterklasse hinzuzufügen (d. H. Wenn sich die Oberklasse SpecialisedFooClass
ändert), werde ich unweigerlich vergessen, diese Referenz zu aktualisieren. Ich habe tatsächlich diesen Fehler IRL mit der Codebasis gemacht, an der ich arbeite (die nicht tatsächlich mit foos, bams und Fledermäusen beschäftigt ...).
Es gibt eigentlich keine spezielle Anforderung in meinem Fall, dass foos
ein Klassenmitglied ist eher als eine Instanz Mitglied, so würde dies auch funktionieren, aber ich finde es hässlich. Auch der super
Aufruf hat immer noch eine explizite Klassenreferenz - weniger beunruhigend hier, weil es zu der Klasse in der es erscheint.
class FooClass(object):
def __init__(self, *args, **kwargs):
self.foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
class SpecialisedFooClass(FooClass):
def __init__(self, *args, **kwargs):
super(SpecialisedFooClass, self).__init__(*args, **kwargs)
self.foos.append("spec")
Welche anderen Möglichkeiten gibt es, und gibt es eine "Pythonic" Weg, dies zu tun?
Die Metaklasse Ansatz ist cool, hätte nicht gedacht! – Bahrom
In diesem kleinen Beispiel ist es wahrscheinlich nicht gerechtfertigt, aber wenn dies nur die Spitze des Eisbergs ist, dann könnte es Sinn machen. –
Eine weitere Option hinzugefügt - Klasse Decorators. –