Articles of herencia múltiple

¿Puede Super tratar con herencia múltiple?

Al heredar de dos objetos como estos. class Foo(object): def __init__(self,a): self.a=a class Bar(object): def __init__(self,b): self.b=b Normalmente haria algo como esto class FooBar(Foo,Bar): def __init__(self,a,b): Foo.__init__(self,a) Bar.__init__(self,b) ¿Cómo sabe super si quiero llamar a los dos? y si es así, ¿cómo sabrá qué argumento pasar dónde? ¿O simplemente no es posible el usuario super […]

herencia múltiple de Python que pasa argumentos a los constructores usando super

Considere el siguiente fragmento de código de Python class A(object): def __init__(self, a): self.a = a class B(A): def __init__(self, a, b): super(B, self).__init__(a) self.b = b class C(A): def __init__(self, a, c): super(C, self).__init__(a) self.c = c class D(B, C): def __init__(self, a, b, c, d): #super(D,self).__init__(a, b, c) ??? self.d = d Me […]

Python: ¿La forma correcta de inicializar cuando las superclases aceptan diferentes argumentos?

Si tengo tres clases como esta: class BaseClass(object): def __init__(self, base_arg, base_arg2=None): … class MixinClass(object): def __init__(self, mixin_arg): … class ChildClass(BaseClass, MixinClass): def __init__(self, base_arg, mixin_arg, base_arg2=None): ??? ¿Cuál es la forma correcta de inicializar MixinClass y BaseClass ? No parece que pueda usar super porque la MixinClass y la BaseClass aceptan diferentes argumentos … […]

Python herencia múltiple de diferentes rutas con el mismo nombre de método

Con el siguiente ejemplo de código, ¿se puede usar super o C tiene que llamar a A.foo y B.foo explícitamente? class A(object): def foo(self): print ‘A.foo()’ class B(object): def foo(self): print ‘B.foo()’ class C(A, B): def foo(self): print ‘C.foo()’ A.foo(self) B.foo(self)

El constructor de herencia múltiple de Python no se llama cuando se usa super ()

Considere el siguiente código: class A(object): def __init__(self): pass class B(object): def __init__(self): self.something = ‘blue’ def get_something(self): return self.something class C(A,B): def __init__(self): super().__init__() print(self.get_something()) y luego hacer: c = C() lo que resulta en algo como esto: AttributeError: ‘C’ object has no attribute ‘something’ Supongo que esto sucede debido a que el constructor […]

¿Por qué no puedo heredar de dict AND Exception en Python?

Tengo la siguiente clase: class ConstraintFailureSet(dict, Exception) : “”” Container for constraint failures. It act as a constraint failure itself but can contain other constraint failures that can be accessed with a dict syntax. “”” def __init__(self, **failures) : dict.__init__(self, failures) Exception.__init__(self) print isinstance(ConstraintFailureSet(), Exception) True raise ConstraintFailureSet() TypeError: exceptions must be classes, instances, or […]

¿Está super () roto en Python-2.x?

A menudo se dice que super debería evitarse en Python 2. Al usar super en Python 2, descubrí que nunca actúa de la manera que espero a menos que proporcione todos los argumentos, como el ejemplo: super(ThisClass, self).some_func(*args, **kwargs) Me parece que esto derrota el propósito de usar super() , ni es más conciso, ni […]

Herencia múltiple de Python: Escoger a qué super () llamar

En Python, ¿cómo selecciono el método de Parent para llamar? Digamos que quiero llamar al método __init__ del __init__ padre. Parece que tengo que especificar ASDF1 en el super () ..? Y si quiero llamar a __init__ de __init__ , entonces debo especificar ASDF2 . >>> class ASDF(ASDF1, ASDF2, ASDF3): def __init__(self): super(ASDF1, self).__init__() >>> […]

La herencia triple causa conflicto de metaclase … A veces

Parece que me encontré con un infierno de metaclase, incluso cuando no quería tener nada que ver con eso. Estoy escribiendo una aplicación en Qt4 usando PySide. Quiero separar la parte controlada por eventos de la definición de la interfaz de usuario, que se genera a partir de archivos de Qt Designer. Por lo tanto, […]

¿Por qué es esto un MRO ambiguo?

class First(object): def __init__(self): print “first” class Second(First): def __init__(self): print “second” class Third(First, Second): def __init__(self): print “third” Fuente ¿Por qué no puede Python crear un MRO consistente? Me parece que está bastante claro: Buscar en primero si el método no existe en tercero Buscar en segundo si el método no existe en primero […]