Найти - Пользователи
Полная версия: Декоратор
Начало » Python для новичков » Декоратор
1
Unnamed001
Здравствуйте, помогите пожалуйста написать декоратор который запускает поток при вызове функции из отдельного класса.


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
4kpt_III
Декоратор должен возвращать функцию, которая станет заменой декорируемой.
Unnamed001
Ну в этом же примере не возвращает функцию и работает..

import threading
def Thread(a):
    t1 = threading.Thread(target=a)
    t1.start()
@Thread
def ttt():
    print "This is a thread function"
Unnamed001
Посмотрите пожалуйста, я правильно делаю?


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()
py.user.next
Пример декоратора
>>> 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
Посмотрите пожалуйста, я правильно делаю?
Да ты в потоках не разбираешься. Декоратор тут ни при чём.

Параметр target должен принимать имя функции, а аргументы передаются через кортеж и словарь.
python.org. thread
Unnamed001
py.user.next
Да ты в потоках не разбираешься.

Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект
ayb
Unnamed001
Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект

Если в Вашем вызов function(*args, **kwargs) возвращает callable объект то все нормально. Хотя врядли это так. В Вашем случае в таргет скорее всего передается результат функции, а не сама функция.
Unnamed001
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
py.user.next
Unnamed001
Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект
Функция - это и есть вызываемый объект.
py.user.next
Unnamed001
Вот так вон наверно тогда правильно будет.
function - это имя функции. К одной функции можно привязать много имён.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB