Что вызывает «необязательный метод __init __ () должен вызываться с экземпляром в качестве первого аргумента» из этого кода Python? - PullRequest
10 голосов
/ 23 октября 2009

У меня есть этот класс:

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) 

и я звоню по этому сценарию:

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

и получите эту ошибку, и я не могу понять, почему: unbound method __init__() must be called with instance as first argument

Ответы [ 4 ]

16 голосов
/ 23 октября 2009

Вы делаете:

Thread.__init__() 

Использование:

Thread.__init__(self) 

Или, скорее, используйте super()

9 голосов
/ 23 октября 2009

Это часто задаваемый вопрос в SO, но вкратце ответ таков: вы вызываете конструктор вашего суперкласса:

super(Timer,self).__init__()
2 голосов
/ 03 ноября 2015

Во-первых, причина, по которой вы должны использовать:

Thread.__init__(self)

вместо

Thread.__init__()

потому что вы используете имя класса, а не объект (экземпляр класса), поэтому вы не можете вызывать метод так же, как объект.

Во-вторых, если вы используете Python 3, рекомендуемый стиль для вызова метода суперкласса из подкласса:

super().method_name(parameters)

Хотя в Python 3 можно использовать:

SuperClassName.method_name(self, parameters)

Это старый стиль синтаксиса, который не является предпочтительным стилем.

1 голос
/ 23 октября 2009

Вам просто нужно передать 'self' в качестве аргумента 'Thread. init '. После этого он работает на моих машинах.

...