python object init

¿Qué hace el método__init__() de object en python?



(3)

Esta pregunta ya tiene una respuesta aquí:

Mientras leía el código de OpenStack y me encontré con esto.

Una clase llamada ''Servicio'' hereda la clase base ''objeto'', y luego en el __init__() del __init__ se llama a __init__ del objeto. El código relacionado se ve así:

la definición de la clase:

class Service(object):

y la definición del método init del Servicio:

def __init__(self, host, binary, topic, manager, report_interval=None, periodic_interval=None, *args, **kwargs):

y una llamada a super (el ''objeto'' aquí) en el inicio del servicio:

super(Service, self).__init__(*args, **kwargs)

No entiendo la última llamada, object.__init__() ¿qué es lo que realmente hace? ¿Alguien puede ayudar?


La respuesta corta es que el método object .__ init __ () no hace nada excepto verificar que no se hayan pasado argumentos. Consulte la fuente para obtener más detalles.

Cuando se llama en una instancia de Servicio , la llamada super() delegará al objeto .__ init __ () y no ocurrirá nada.

Sin embargo, cuando se llama en una instancia de una subclase de Servicio , las cosas se ponen más interesantes. La llamada super () puede potencialmente delegar a alguna clase distinta del objeto , una clase que es un padre de la instancia pero no un padre del Servicio . Para obtener detalles sobre cómo funciona esto y por qué es útil, consulte la publicación del blog ¡ Super Considerado Super de Python !

El siguiente ejemplo (algo artificial) muestra cómo una subclase de Servicio puede hacer que la súper llamada en Servicio se dirija a otra clase llamada Color :

class Service(object): def __init__(self, host, binary, topic, manager, report_interval=None, periodic_interval=None, *args, **kwargs): print ''Initializing Service'' super(Service, self).__init__(*args, **kwargs) class Color(object): def __init__(self, color=''red'', **kwargs): print ''Initializing Color'' self.color = color super(Color, self).__init__(**kwargs) class ColoredService(Service, Color): def __init__(self, *args, **kwds): print ''Initializing Colored Service'' super(ColoredService, self).__init__(*args, **kwds) c = ColoredService(''host'', ''bin'', ''top'', ''mgr'', ''ivl'', color=''blue'')

En el ejemplo, las inicializaciones se producen en el siguiente orden:

  1. Inicializando servicio de color
  2. Inicializando Servicio
  3. Inicializando Color
  4. Inicializar objeto - no hacer nada, excepto la comprobación de argumentos

object.__init__() realidad no hace nada, pero la llamada super() debe incluirse incluso cuando una clase solo tiene un object como superclase.

Un gran problema con ''super'' es que parece que hará que se llame a la copia del método de la superclase. Esto simplemente no es el caso, hace que se llame al siguiente método en el MRO (...) Las personas omiten las llamadas a super (...). init si la única superclase es ''objeto'', como, después de todo, objeto. ¡init no hace nada! Sin embargo, esto es muy incorrecto. Hacerlo causará que los métodos de inicio de otras clases no sean llamados.

http://fuhm.net/super-harmful/


super() no siempre devuelve un proxy para la clase padre. En su lugar, devuelve un proxy para la siguiente clase en MRO . En herencia simple no hay diferencia entre MRO y la cadena de herencia. En herencia múltiple, MRO puede resultar en una clase en la otra cadena de herencia en su lugar.