2011-07-26 15 views
5

Estoy aprendiendo python vía dive en python. Tengo algunas preguntas y no puedo entender, incluso a través de la documentación.Python classes and __init__ method

1) BaseClass

2) InheritClass

¿Qué es exactamente ocurre cuando asignamos un InheritClass ejemplo a una variable, cuando el InheritClass no contiene un método __init__ y BaseClass hace?

  • es la BaseClass__init__ método llamado automáticamente
  • Además, dime otras cosas que suceden bajo el capó.

En realidad, el ejemplo de fileInfo.py me está causando un gran dolor de cabeza, simplemente no puedo entender cómo funcionan las cosas. Siguiendo

Respuesta

6

Sí, BaseClass.__init__ se llamará automáticamente. Lo mismo ocurre con cualquier otro método definido en la clase principal pero no en la clase hija. Observe:

>>> class Parent(object): 
... def __init__(self): 
...  print 'Parent.__init__' 
... def func(self, x): 
...  print x 
... 
>>> class Child(Parent): 
... pass 
... 
>>> x = Child() 
Parent.__init__ 
>>> x.func(1) 
1 

El elemento secundario hereda los métodos de sus padres. Puede anularlos, pero no tiene por qué.

+0

¿Quería decir que se llamarán todos los métodos de 'BaseClass', independientemente de que los llame o no? –

+2

No, 'child.func' llamará a' func' en la clase principal si no existe en la clase secundaria. – FogleBird

+2

El punto es que al crear 'Child', hay una llamada implícita al método' __init__' de 'Child', que se hereda siempre que no esté explícitamente definido. –

4

@FogleBird ya ha respondido a su pregunta, pero quería añadir algo y no puede hacer comentarios sobre su mensaje:

También puede que desee ver en el super function. Es una forma de llamar al método de un padre desde adentro de un niño. Es útil cuando se desea extender un método, por ejemplo:

class ParentClass(object): 
    def __init__(self, x): 
     self.x = x 

class ChildClass(ParentClass): 
    def __init__(self, x, y): 
     self.y = y 
     super(ChildClass, self).__init__(x) 

Esto puede, por supuesto abarcan métodos que son mucho más complicadas, no el método __init__ o incluso un método con el mismo nombre!