es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La manera correcta de usar A_factory dentro de la clase A_vn(Mixin) para dotar a los objetos de tipo A con los métodos mixin es definir una nueva clase A_vn que herede de A y Mixin y luego redefinir el método __new__ de la clase A_factory para devolver una instancia de A_vn en lugar de A. Así es como debería verse el código:

    class A:
        pass
    
    class A_factory:
        def __new__(self):
            return A()
    
    class Mixin:
        def method(self):
            print('aha!')
    
    class A_vn(A, Mixin):
        pass
    
    # Redefine the A_factory class to create instances of A_vn
    class A_factory:
        def __new__(self):
            return A_vn()
    

    Ahora A_vn().method() debería funcionar e imprimir ‘aha!’. Esto funciona porque A_vn hereda de A y Mixin, por lo que las instancias de A_vn tienen todos los atributos y métodos de ambas clases. Y al redefinir el método __new__ de A_factory, nos aseguramos de que cree instancias de A_vn en lugar de A, por lo que esas instancias también tienen los métodos mixin.

Comments are closed.