Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2016 10:15:28

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

Как сделать выполнение функции как Event-событие?

Здравствуйте, подскажите пожалуйста.

# file1.py
class TEMP1(object):
    def __init__(self): pass
    def func1(self, *a, **k):
        print 'TEMP1 > func1'
        
t1 = TEMP1()
        
# file2.py
#from file1 import TEMP1
def decorate(function):
    print 'start decorate'
    def wrap(*a, **k):
        print 'start wrap'
        return function(*a, **k)
    return wrap
@decorate
def new_func1(*a, **k):
    old_func1(*a, **k)
    print 'hook: new_func1'
    
old_func1 = TEMP1.func1
TEMP1.func1 = new_func1
def myFunc():
    print 'myFunc'
t1.func1()

Как в функции decorate определить нашу function как Event (если я правильно понимаю), чтобы к ней можно было прописать function += myFunc?

Офлайн

#2 Апрель 7, 2016 11:26:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как сделать выполнение функции как Event-событие?

Изобретатель, вы чего в конечном итоге сделать то хотите? Давайте без event-ов и прочих глупостей, какую текущую задачу вы хотите решить вот этим function += myFunc ?



Офлайн

#3 Апрель 7, 2016 11:48:11

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

Как сделать выполнение функции как Event-событие?

FishHook
Изобретатель, вы чего в конечном итоге сделать то хотите? Давайте без event-ов и прочих глупостей, какую текущую задачу вы хотите решить вот этим function += myFunc ?

Таких fuinction очень много у меня, и есть отдельные классы, в этих классах есть функции которые и необходимо приаттачить к этой самой function которая в декораторе. Чтобы при вызове перехваченной функции из моих классов выполнялись нужные функции (+= myFunc)

Если коротко, мне нужно чтобы при вызове перехваченной функции выполнялись мои, по средствам += myFunc1, += myFunc2, += myFunc3 ..

Отредактировано Unnamed001 (Апрель 7, 2016 12:30:16)

Офлайн

#4 Апрель 7, 2016 12:52:05

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

Как сделать выполнение функции как Event-событие?

У меня перехватывается функция

def new_func1(*a, **k):
    old_func1(*a, **k)
    print 'hook: new_func1'
    
old_func1 = TEMP1.func1
TEMP1.func1 = new_func1

А также есть словарь со списком классов и функций: {class: func, ..}
Мне нужно пройтись по нему циклом и приаттачить += к перехваченной функции, а она выдает ошибка, чтобы при вызове перехваченной функции в добавок выполнились мои из словаря.

<<< TypeError: unsupported operand type(s) for +=: ‘function’ and ‘function’

Отредактировано Unnamed001 (Апрель 7, 2016 12:53:02)

Офлайн

#5 Апрель 7, 2016 17:54:53

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Как сделать выполнение функции как Event-событие?

1 Читаем, что такое посредник (mediator).
2 Читаем, что такое наблюдатель (observer).
Выбираем любой понравившийся

Офлайн

#6 Апрель 7, 2016 19:26:25

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

Как сделать выполнение функции как Event-событие?

Мне не нужны сторонние библиотеки.

Отредактировано Unnamed001 (Апрель 7, 2016 19:26:37)

Офлайн

#7 Апрель 7, 2016 19:32:32

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как сделать выполнение функции как Event-событие?

Unnamed001
это шаблоны проектирования :-)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Апрель 7, 2016 21:48:54

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как сделать выполнение функции как Event-событие?

Unnamed001
Мне не нужны сторонние библиотеки.
Вам нужны потусторонние? Если вы не будете использовать библиотеки то питон вам не нужен.

Я правильно понимаю что вы хотите функционал типа делегата в C#?
class Td(list):
    def __init__(self, *args):
        list.__init__(self, *args)
    def __call__(self):
        for i in self:
            i()
    def __iadd__(self,i):
        self.append(i)
        return self
a=Td()
def b():
    print("hello! b")
a+=b
a+=b
a()
>>> 
hello! b
hello! b



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version