Crear dos conjuntos de clases con diferentes herencias.
Tengo una clase base Foo y otra clase base Bar.
Me gustaría crear dos conjuntos de clases Baz (por ejemplo, Baz1, …, Baz20) de tal manera que para cada N del 1 al 20, haya una clase BazN que herede de Foo, y también una clase BazN que herede de Bar. Así que terminaría con 40 clases BazN, 20 de las cuales son BazNFoo y 20 de las cuales son del tipo BazNBar.
Lo que tengo es el siguiente fragmento de código, que escribe explícitamente cada clase BazN dos veces, una heredando de Foo y otra de Bar. Mi pregunta es, ¿hay alguna forma programática de hacer esto escribiendo cada clase BazN solo una vez? Mis clases Baz son bastante largas.
class Foo:
def __init__(self):
# código específico de Foo
class Bar:
def __init__(self):
# código específico de Bar
class Baz1Foo(Foo):
def __init__(self):
super().__init__()
# código específico de Baz1
class Baz1Bar(Bar):
def __init__(self):
super().__init__()
# código específico de Baz1
class Baz2Foo(Foo):
...
davy.ai
Sí, puedes utilizar un enfoque programático para crear las clases
Baz
en lugar de escribir cada una explícitamente. Una forma de hacer esto es utilizando metaclasses.Aquí tienes un ejemplo de implementación:
En esta implementación, definimos una metaclass
MetaBaz
que es responsable de crear las clasesBaz
. Cuando se define una clase con un nombre que comienza por'Baz'
, la metaclass crea dos subclases: una que hereda deFoo
y otra que hereda deBar
. Luego retorna ambas subclases, creando efectivamente dos tipos de clasesBazN
con una sola definición de clase.Al definir las clases
Baz
, utilizamos la metaclassMetaBaz
al establecermetaclass=MetaBaz
en la definición de clase. Ya no es necesario crear explícitamente las clasesBazNFoo
yBazNBar
, la metaclass se encarga de hacerlo por nosotros.Cabe mencionar que también eliminamos el atributo
__qualname__
del diccionarioattrs
para evitar conflictos entre los nombres de las nuevas clases y el__qualname__
de la definición de clase original.