O que está causando “__init método desacoplado __ () deve ser chamado com instância como primeiro argumento” a partir deste código Python?
Pergunta
Eu tenho essa classe:
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)
e estou chamando-lo com este script:
import timer
def hello():
print \"hello, world
t = timer.Timer(1.0, hello)
t.run()
e receber esse erro e eu não consigo descobrir o porquê: unbound method __init__() must be called with instance as first argument
Solução
Você está fazendo:
Thread.__init__()
Use:
Thread.__init__(self)
Ou melhor, uso super()
Outras dicas
Esta é uma pergunta freqüente no SO, mas a resposta, em resumo, é que a maneira como você chamar o construtor da sua superclasse é semelhante:
super(Timer,self).__init__()
Em primeiro lugar, a razão que você deve usar:
Thread.__init__(self)
em vez de
Thread.__init__()
é porque você está usando o nome da classe, e não um objeto (uma instância da classe), então você não pode chamar um método da mesma maneira como um objeto.
Em segundo lugar, se você estiver usando Python 3, o estilo recomendado para chamar um método de classe super de uma classe sub é:
super().method_name(parameters)
Embora em Python 3 é possível usar:
SuperClassName.method_name(self, parameters)
É um estilo antigo de sintaxe que não é o estilo preferir.
Você só precisa passar 'eu' como um argumento para 'Thread. init '. Depois disso, ele funciona em minhas máquinas.