Форум сайта python.su
0
Здравствуйте, помогите пожалуйста написать декоратор который запускает поток при вызове функции из отдельного класса.
import threading def Thread(a): threading.Thread(target=a).start() class abc(object): def __init__(self): self.asd() @Thread def asd(self): print 'This is a thread function' abc()
<<< Traceback (most recent call last): <<< File "<string>", line 13, in <module> <<< File "<string>", line 9, in __init__ <<< TypeError: 'NoneType' object is not callable
Отредактировано Unnamed001 (Дек. 20, 2015 19:10:23)
Офлайн
39
Декоратор должен возвращать функцию, которая станет заменой декорируемой.
Офлайн
0
Ну в этом же примере не возвращает функцию и работает..
import threading def Thread(a): t1 = threading.Thread(target=a) t1.start() @Thread def ttt(): print "This is a thread function"
Отредактировано Unnamed001 (Дек. 20, 2015 20:00:02)
Офлайн
0
Посмотрите пожалуйста, я правильно делаю?
from threading import Thread def th(function): def decorate(*args, **kwargs): Thread(target = function(*args, **kwargs)).start() return decorate class test1(object): def __init__(self): self.func1('test') @th def func1(self, *args): print args[0] test1()
Отредактировано Unnamed001 (Дек. 21, 2015 22:03:16)
Офлайн
857
Пример декоратора
>>> def dec(func): ... def g(*args, **kwargs): ... return func(*args, **kwargs) * 2 ... return g ... >>> @dec ... def f1(): ... return 3 ... >>> @dec ... def f2(): ... return 5 ... >>> f1() 6 >>> f2() 10 >>>
Unnamed001Да ты в потоках не разбираешься. Декоратор тут ни при чём.
Посмотрите пожалуйста, я правильно делаю?
Отредактировано py.user.next (Дек. 22, 2015 02:42:21)
Офлайн
0
py.user.next
Да ты в потоках не разбираешься.
Офлайн
24
Unnamed001
Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект
Отредактировано ayb (Дек. 22, 2015 08:56:50)
Офлайн
0
ayb
from threading import Thread def th(function): def decorate(*args, **kwargs): Thread(target = function, args = args).start() return decorate class test1(object): def __init__(self): self.func1('test') @th def func1(self, *args): print args[0] test1()
<<< test
Офлайн
857
Unnamed001Функция - это и есть вызываемый объект.
Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект
Офлайн
857
Unnamed001function - это имя функции. К одной функции можно привязать много имён.
Вот так вон наверно тогда правильно будет.
Отредактировано py.user.next (Дек. 22, 2015 10:19:45)
Офлайн