Найти - Пользователи
Полная версия: Как сделать выполнение функции как Event-событие?
Начало » Python для новичков » Как сделать выполнение функции как Event-событие?
1
Unnamed001
Здравствуйте, подскажите пожалуйста.
# 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?
FishHook
Изобретатель, вы чего в конечном итоге сделать то хотите? Давайте без event-ов и прочих глупостей, какую текущую задачу вы хотите решить вот этим function += myFunc ?
Unnamed001
FishHook
Изобретатель, вы чего в конечном итоге сделать то хотите? Давайте без event-ов и прочих глупостей, какую текущую задачу вы хотите решить вот этим function += myFunc ?

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

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

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’
4kpt_IV
1 Читаем, что такое посредник (mediator).
2 Читаем, что такое наблюдатель (observer).
Выбираем любой понравившийся
Unnamed001
Мне не нужны сторонние библиотеки.
JOHN_16
Unnamed001
это шаблоны проектирования :-)
doza_and
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
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