Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 20, 2015 19:09:07

Unnamed001
Зарегистрирован: 2015-01-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор

Здравствуйте, помогите пожалуйста написать декоратор который запускает поток при вызове функции из отдельного класса.


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)

Офлайн

#2 Дек. 20, 2015 19:24:18

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Декоратор

Декоратор должен возвращать функцию, которая станет заменой декорируемой.

Офлайн

#3 Дек. 20, 2015 19:47:32

Unnamed001
Зарегистрирован: 2015-01-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор

Ну в этом же примере не возвращает функцию и работает..

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)

Офлайн

#4 Дек. 21, 2015 22:02:22

Unnamed001
Зарегистрирован: 2015-01-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор

Посмотрите пожалуйста, я правильно делаю?


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)

Офлайн

#5 Дек. 22, 2015 02:39:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Декоратор

Пример декоратора

>>> 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



Отредактировано py.user.next (Дек. 22, 2015 02:42:21)

Офлайн

#6 Дек. 22, 2015 08:49:10

Unnamed001
Зарегистрирован: 2015-01-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор

py.user.next
Да ты в потоках не разбираешься.

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

Офлайн

#7 Дек. 22, 2015 08:56:29

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Декоратор

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

Если в Вашем вызов function(*args, **kwargs) возвращает callable объект то все нормально. Хотя врядли это так. В Вашем случае в таргет скорее всего передается результат функции, а не сама функция.

Отредактировано ayb (Дек. 22, 2015 08:56:50)

Офлайн

#8 Дек. 22, 2015 09:21:38

Unnamed001
Зарегистрирован: 2015-01-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Декоратор

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

Офлайн

#9 Дек. 22, 2015 09:41:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Декоратор

Unnamed001
Да ладно, давно ли target имя функции принимает, он принимает вызываемый объект
Функция - это и есть вызываемый объект.



Офлайн

#10 Дек. 22, 2015 10:18:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Декоратор

Unnamed001
Вот так вон наверно тогда правильно будет.
function - это имя функции. К одной функции можно привязать много имён.



Отредактировано py.user.next (Дек. 22, 2015 10:19:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version