Изпълнявайте клас-метод на всеки n секунди

Опитвам се да стартирам метод на клас в Python 3 на всеки n секунди.

Мислех, че Threading ще бъде добър подход. Въпросът (Изпълняване на определен код на всеки n секунди) показва как да направите това без обекти.

Опитах се да "прехвърля" този код в OOP по следния начин:

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
прав си. Малко ме е срам :O   -  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, за който OP говори, няма необвързани функции. Достатъчно справедливо за това, че 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