2016-08-25 1 views
0

За последние 6 месяцев я создал много классов и функции для разных вычислений. Теперь я хотел бы присоединиться к ним в класс, чтобы его могли использовать другие пользователи. Как и многие из методов, они могут выполняться последовательно, и последовательность может потребоваться несколько раз для разных наборов данных. Я хотел бы создать функцию в основном классе, которая сохраняет процедуру, используемую пользователем, чтобы пользователь мог запустить ее снова, не пройдя всю процедуру снова.Обновление списка при каждом выполнении функции внутри класса с аргументами функции и значениями

Важно: Я бы не хотел менять классы, которые уже были реализованы, но если это единственный способ, не проблема.

Идея была бы более или менее как код представлен ниже:

class process(object): 
    def __init__(self): 
     self.procedure = [] 

    def MethodA(valueA): 
     pass 

    def MethodB(valueB): 
     pass 

    def UpdateProcedure(self, method, arguments, values): 
     # Execute this every time that MethodA or MethodB is executed. 
     new = {'Method':method, 'Arguments':arguments, 'Values':values} 
     self.procedure.append(new) 

Например:

a = process.MethodA(2) 
b = process.MethodB(3) 

print(process.procedure) 
>>> [{'Method':'MethodA', 'Arguments':['valueA'], 'Values':[2]}, {'Method':'MethodB', 'Arguments':['valueB'], 'Values':[3]}] 

Я попытался использовать функции inspect.currentframe и __getattribute__ вместе, но я не сделал получить хорошие результаты.

Любые идеи, которые помогут мне в решении этой проблемы?

Благодаря

+1

Вы можете se 'decorator' для достижения этого –

ответ

1

Вот как использовать декоратор, за предложение Мойнуддина QUADRI в:

def remember(func): 
    def inner(*args, **kwargs): 
     args[0].procedure.append({'method': func, 
            'args': args, 
            'kwargs': kwargs}) 
     return func(*args, **kwargs) 
    return inner 

class process(object): 
    def __init__(self): 
     self.procedure = [] 

    @remember 
    def MethodA(self, valueA): 
     pass 

    @remember 
    def MethodB(self, valueB): 
     pass 

Это делает его так, что каждый раз, когда каждый из этих украшенных методов называются, она добавит свои аргументы, что массив процедур объекта. Этот декоратор не будет работать с неклассическими методами.

Вызывающие эти команды:

p = process() 

p.MethodA(1) 
p.MethodB(2) 
p.MethodA(3) 
p.MethodB(4) 
print p.procedure 

приведут в следующем, если довольно напечатал:

[{'args': (<__main__.process object at 0x7f25803d28d0>, 1), 
    'kwargs': {}, 
    'method': <function MethodA at 0x7f25803d4758>}, 
{'args': (<__main__.process object at 0x7f25803d28d0>, 2), 
    'kwargs': {}, 
    'method': <function MethodB at 0x7f25803d4848>}, 
{'args': (<__main__.process object at 0x7f25803d28d0>, 3), 
    'kwargs': {}, 
    'method': <function MethodA at 0x7f25803d4758>}, 
{'args': (<__main__.process object at 0x7f25803d28d0>, 4), 
    'kwargs': {}, 
    'method': <function MethodB at 0x7f25803d4848>}] 

где <__main__.process object at 0x7f25803d28d0> является объектом процесса (self)

Подробнее о декораторов здесь: https://en.wikipedia.org/wiki/Python_syntax_and_semantics#Decorators

Смежные вопросы