Parece que es posible cambiar dinámicamente Base.__bases__
si Base.__base__
no es object
. (Por cambio dinámico, me refiero a que todas las instancias preexistentes que heredan de Base
también se cambian dinámicamente. De lo contrario, consulte Mykola Kharechko's solution).
Si Base.__base__
es alguna clase ficticia TopBase
, a continuación, la asignación a Base.__bases__
parece funcionar:
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...
Esto fue probado para trabajar en Python 2 (para las clases de estilo antiguo y nueva-) y para Python 3. No tengo idea de por qué funciona mientras que esto no funciona:
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'
¿Tus bases ya no eres tú? Y la respuesta será difícil? – Borealid
Creo que esto ya no es posible ya que todas las clases son de estilo nuevo en Python 3, y el MRO sería ambiguo si 'Base' tuviera tanto' object' como 'Extender' como clases base. Cree una nueva clase que herede de 'Base' y' Extender' en su lugar. 'Extender' también podría ser un ABC. – Philipp