La forma correcta de extender una clase en Python es utilizando la palabra clave “class” seguida del nombre de la clase hija y el nombre de la clase padre entre paréntesis. Por ejemplo: class Hija(Padre): # código de la clase hija
Se me ha asignado una fábrica designada de objetos de tipo A
. Me gustaría crear una nueva versión de objetos de tipo A
que también tengan los métodos de una clase Mixin
. Por razones que son demasiado largas para explicar aquí, no puedo usar class A(Mixin)
, tengo que usar A_factory
. A continuación, intento dar un ejemplo básico.
Pensé ingenuamente que sería suficiente heredar de Mixin
para dotar a objetos de tipo A
con los métodos mixin, pero los intentos a continuación no funcionan:
class A: pass
class A_factory:
def <strong>nuevo</strong>(self):
return A()
class Mixin:
def método(self):
print('¡aha!')
class A<em>v2(Mixin): # intento 1
def <strong>nuevo</strong>(cls):
return A</em>factoría()
class A<em>v3(Mixin): # intento 2
def <strong>nuevo</strong>(cls):
self = A</em>factoría()
super().<strong>init</strong>(self)
return self
De hecho, A_v2().método()
y A_v3().método()
generan AttributeError: 'A' object has no attribute 'método'
.
¿Cuál es la forma correcta de usar A_factory
dentro de class A_vn(Mixin)
para que los objetos de tipo A
creados por la fábrica hereden los métodos mixin?
davy.ai
La manera correcta de usar
A_factory
dentro de la claseA_vn(Mixin)
para dotar a los objetos de tipoA
con los métodos mixin es definir una nueva claseA_vn
que herede deA
yMixin
y luego redefinir el método__new__
de la claseA_factory
para devolver una instancia deA_vn
en lugar deA
. Así es como debería verse el código:Ahora
A_vn().method()
debería funcionar e imprimir ‘aha!’. Esto funciona porqueA_vn
hereda deA
yMixin
, por lo que las instancias deA_vn
tienen todos los atributos y métodos de ambas clases. Y al redefinir el método__new__
deA_factory
, nos aseguramos de que cree instancias deA_vn
en lugar deA
, por lo que esas instancias también tienen los métodos mixin.