2009-10-23 14 views
8

que tienen esta clase:¿Qué causa que se llame al "método independiente __init __() con la instancia como primer argumento" de este código Python?

from threading import Thread 
import time 

class Timer(Thread): 
    def __init__(self, interval, function, *args, **kwargs): 
     Thread.__init__() 
     self.interval = interval 
     self.function = function 
     self.args = args 
     self.kwargs = kwargs 
     self.start() 

    def run(self): 
     time.sleep(self.interval) 
     return self.function(*self.args, **self.kwargs) 

y estoy llamando con este script:

import timer 
    def hello(): 
     print \"hello, world 
    t = timer.Timer(1.0, hello) 
    t.run() 

y obtiene este error y no puedo entender por qué: unbound method __init__() must be called with instance as first argument

Respuesta

15

Usted está haciendo:

Thread.__init__() 

Uso:

Thread.__init__(self) 

O, más bien, utiliza super()

+6

Eso sería 'super (Thread, self) .__ init __()' - pero súper tiene sus propios problemas también:/ –

+2

@ THC4k: Super no tiene problemas, la herencia múltiple tiene problemas. Y si usa herencia múltiple, entonces super es mucho mejor que las llamadas directas. – nikow

+0

super es solo una receta para el desastre, especialmente en la herencia múltiple, más especialmente si hay extensiones que necesiten recargarse. – dashesy

10

Esta es una pregunta frecuente en SO, pero la respuesta, en resumen, es que la forma en que llamas al constructor de tu superclase es como:

super(Timer,self).__init__() 
1

Sólo tiene que pasar 'yo' como un argumento a 'hilo. init '. Después de eso, funciona en mis máquinas.

1

En primer lugar, la razón debe utilizar:

Thread.__init__(self) 

en lugar de

Thread.__init__() 

se debe a que está utilizando el nombre de la clase, y no un objeto (una instancia de la clase), por lo no puede llamar a un método de la misma manera que un objeto.

En segundo lugar, si está utilizando Python 3, el estilo recomendado para invocar un método de superclase de una subclase es:

super().method_name(parameters) 

Aunque en Python 3 es posible utilizar:

SuperClassName.method_name(self, parameters) 

Es un estilo antiguo de sintaxis que no es el estilo preferido.

Cuestiones relacionadas