Es scheint, dass es möglich ist, dynamisch Base.__bases__
zu ändern, wenn Base.__base__
nicht object
. (Bei dynamischer Änderung meine ich, dass alle vorexistierenden Instanzen, die von Base
erben, ebenfalls dynamisch geändert werden. Ansonsten siehe Mykola Kharechko's solution).
Wenn Base.__base__
einig Dummy-Klasse ist TopBase
, dann Zuordnung zu Base.__bases__
scheint zu funktionieren:
class Extender(object):
def extension(self):
print("Some work...")
class TopBase(object):
pass
class Base(TopBase):
pass
b=Base()
print(Base.__bases__)
# (<class '__main__.TopBase'>,)
Base.__bases__ += (Extender,)
print(Base.__bases__)
# (<class '__main__.TopBase'>, <class '__main__.Extender'>)
Base().extension()
# Some work...
b.extension()
# Some work...
Base.__bases__ = (Extender, TopBase)
print(Base.__bases__)
# (<class '__main__.Extender'>, <class '__main__.TopBase'>)
Base().extension()
# Some work...
b.extension()
# Some work...
Dies wurde getestet in Python 2 arbeiten (für Neu- und alten Stil-Klassen) und für Python 3. Ich habe keine Ahnung, warum es funktioniert, solange dies nicht funktioniert:
class Extender(object):
def extension(self):
print("Some work...")
class Base(object):
pass
Base.__bases__ = (Extender, object)
# TypeError: __bases__ assignment: 'Extender' deallocator differs from 'object'
Ihre Basen gehören Ihnen nicht mehr? Und die Antwort wird schwer? – Borealid
Ich denke, das ist nicht mehr möglich, da alle Klassen neue Stilklassen in Python 3 sind, und die MRO wäre mehrdeutig, wenn "Base" sowohl "Objekt" als auch "Extender" als Basisklassen hätte. Erstellen Sie eine neue Klasse, die stattdessen von "Base" und "Extender" erbt. "Extender" könnte auch ein ABC sein. – Philipp