2009-10-23 14 views
8

J'ai cette classe:Quelle est la cause de la méthode "unbin __init __() doit être appelée avec l'instance en tant que premier argument" de ce code 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) 

et je appelle avec ce script:

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

et obtenir cette erreur et je ne peux pas comprendre pourquoi: unbound method __init__() must be called with instance as first argument

Répondre

15

Vous faites:

Thread.__init__() 

Utilisation:

Thread.__init__(self) 

Ou plutôt, utilisez super()

+6

Ce serait super (Thread, self) .__ init __() '- mais super a aussi ses propres problèmes:/ –

+2

@ THC4k: Super n'a pas de problèmes, l'héritage multiple a des problèmes. Et si vous utilisez l'héritage multiple, super est beaucoup mieux que les appels directs. – nikow

+0

super est juste une recette pour un désastre, spécialement dans l'héritage multiple, plus spécialement s'il y a des extensions qui ont besoin d'être rechargées. – dashesy

10

C'est un Foire aux questions à SO, mais la réponse, en bref, est que la façon dont vous appelez le constructeur de votre superclasse est comme:

super(Timer,self).__init__() 
1

Vous avez juste besoin de passer 'soi' comme argument de « discussion. init '. Après ça, ça marche sur mes machines.

1

D'abord, la raison pour laquelle vous devez utiliser:

Thread.__init__(self) 

au lieu de

Thread.__init__() 

est parce que vous utilisez le nom de la classe, et non un objet (une instance de la classe), alors vous ne pouvez pas appeler une méthode de la même manière qu'un objet.

Deuxièmement, si vous utilisez Python 3, le style recommandé pour appeler une méthode super classe à partir d'une sous-classe est:

super().method_name(parameters) 

Bien que dans Python 3 est possible d'utiliser:

SuperClassName.method_name(self, parameters) 

C'est un ancien style de syntaxe qui n'est pas le style préféré.