Uno puede ver lo que está haciendo Python aquí, pero la forma de anulación es un poco extrema. Tomemos el caso cuando la clase A define 100 atributos y la clase B los hereda y agrega 1 atributo más. Queremos poder tener el __init __() para B llamar al __init __() para A y dejar que el código de B defina solo su único atributo. De manera similar, si definimos un método reset() en A para establecer todos los atributos en cero, entonces el método reset() correspondiente para B debería poder llamar al método reset() para A y luego poner a cero el único atributo B en su lugar de tener que duplicar todo el código de A. Python está dificultando lo que se supone que es una gran ventaja de la programación orientada a objetos; es decir, la reutilización del código. La mejor opción aquí es evitar la anulación de los métodos que realmente queremos reutilizar. Si quieres tener una idea de las complicaciones con Python aquí, prueba este código:
class X(object):
def __init__ (self):
print "X"
self.x = 'x'
self.reset()
print "back to X"
def reset (self):
print "reset X"
self.xx = 'xx'
class Y(X):
def __init__ (self):
print "Y"
super(Y,self).__init__()
self.y = 'y'
self.reset()
print "back to Y"
def reset (self):
print "reset Y"
super(Y,self).reset()
print "back to reset Y"
self.yy = 'yy'
aY = Y()
(Para que esto funcione correctamente, retire la self.reset() en __init __() de la clase Y.)
Básicamente, estás pidiendo a Python que deje de lado la dinámica y los métodos virtuales y * de alguna manera * descubras omitir partes de la cadena de búsqueda de atributos según el lugar donde se define léxicamente una función. No va a pasar. – delnan