O que está causando “__init método desacoplado __ () deve ser chamado com instância como primeiro argumento” a partir deste código Python?

StackOverflow https://stackoverflow.com/questions/1615148

  •  06-07-2019
  •  | 
  •  

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top