Запускать метод класса каждые n секунд

Я пытаюсь запускать метод класса в Python 3 каждые n секунд.

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

Я попытался "перенести" этот код в ООП так:

class Test:
    import threading
    def printit():
        print("hello world")
        threading.Timer(5.0, self.printit).start()

test = Test()
test.printit()

>> TypeError: printit() takes no arguments (1 given)

Я получаю эту ошибку.

Можете ли вы помочь мне сделать это правильно?


person speendo    schedule 14.11.2014    source источник
comment
Ваш метод определен неправильно. Вам не хватает параметра self   -  person Asad Saeeduddin    schedule 15.11.2014
comment
ты прав. Мне немного стыдно :О   -  person speendo    schedule 15.11.2014
comment
Случается с каждым в тот или иной момент. То, что вы определили, является статическим методом. Если ваш класс действительно не содержит никаких данных и имеет только этот метод, вы должны оставить определение как есть и использовать Test.printit()   -  person Asad Saeeduddin    schedule 15.11.2014
comment
В качестве примечания, вы действительно не хотите делать import внутри определения класса. (Есть некоторые редкие случаи, когда это может иметь смысл, но это не один из них.) Делайте это на верхнем уровне, в верхней части вашего сценария.   -  person abarnert    schedule 15.11.2014
comment
@Asad: Нет, он не определил статический метод; вам нужно добавить @staticmethod для этого. Он определил метод экземпляра, который нельзя вызвать для экземпляра. Ваше предложение в целом работает, но оно вводит в заблуждение.   -  person abarnert    schedule 15.11.2014
comment
@abarnert Нет, он во многом определил статический метод, по крайней мере, в том смысле, как статические методы определяются в большинстве языков, то есть метод, который вызывается для типа/класса, в котором он определен, а не его экземпляр. Применяет ли он удобный декоратор статического метода, не имеет значения (он просто оборачивает фактический статический метод функцией, которая изящно разрешает вызовы экземпляров).   -  person Asad Saeeduddin    schedule 15.11.2014
comment
@Asad: то, как статические методы определяются в большинстве языков, не имеет отношения к Python, у которого есть собственное определение статических методов. Он определил метод, который на самом деле нельзя назвать методом; поскольку несвязанные методы (то, что возвращает дескриптор, когда вы ищете атрибут в самом классе) представлены как простые функции в Python 3.x (но не 2.x), его можно, по совпадению, вызвать как несвязанный метод.   -  person abarnert    schedule 15.11.2014
comment
Это Python 3.x, о котором говорит ОП, несвязанных функций нет. Достаточно справедливо, что у Python есть собственное определение, но я чувствую, что это использование полностью на его голове. Вызываемый член класса, который не имеет и не может получить доступ к экземпляру класса и может быть вызван через ссылку на класс, не является статическим методом. Вместо этого это невызываемый метод экземпляра. Это всего лишь статический метод, когда вы применяете этот декоратор, который мы вам даем, который устраняет его и путает сигнатуру вызова, чтобы его можно было вызывать как метод экземпляра. Не имеет большого смысла для меня.   -  person Asad Saeeduddin    schedule 15.11.2014


Ответы (1)


Добавьте аргумент self в метод printit, и он у меня работает. Кроме того, операторы импорта должны находиться в начале файла, а не в определении класса.

import threading

class Test:
    def printit(self):
        print("hello world")
        threading.Timer(5.0, self.printit).start()

test = Test()
test.printit()
person mdadm    schedule 14.11.2014
comment
Не беда, со всеми бывает! - person mdadm; 15.11.2014