2015-10-06 5 views
0
from datetime import datetime 
import time 

class Base(object): 
    def __init__(self): 
     pass 

    def storeResult(self, function_name, result, executed_time= None): 
     pass # store result in nested dictinary 



class Derived(Base): 

    def __init__(self): 
     pass 

    def sum(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     result = a + b 
     super(Base, self).storeResult("sum", result, str(datetime.now())) # Don't want to pass string,Is there any pythonic way of passing function name 

    def diff(self, a, b): 
     print 'In derived!' 
     result = a - b 
     super(Base, self).storeResult("diff", result, str(datetime.now())) # Don't want to pass string, Is there any pythonic way of passing function name 

    def multiply(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     result = a * b 
     super(Base, self).storeResult("multiply", result, str(datetime.now())) # Don't want to pass string, Is there any pythonic way of passing function name 

    def divide(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     result = a/b 
     super(Base, self).storeResult("divide", result, str(datetime.now())) # Don't want to pass string, Is there any pythonic way of passing function name 


if __name__ == '__main__': 
    d = Derived() 
    d.sum(1,2) 
    d.diff(2,1) 
    d.multiply(1,2) 
    d.divide(10,5) 
    d.sum(1,12) 
    d.diff(12,1) 
    d.multiply(11,2) 
    d.divide(10,15) 
    d.sum(11,12) 
    d.diff(12,1) 
    d.multiply(11,2) 
    d.divide(110,5) 

я столкнулся следующая проблема:Как передать имя функции дочернего класса в качестве параметра для метода родительского класса в python?

1) Я хочу, чтобы вызвать метод родительского класса от дочернего класса: линии 79, в сумме :: супер (Base, самость) .storeResult ("сумма", результат , str (datetime.now())) AttributeError: объект 'super' не имеет атрибута 'storeResult'

2) Как передать имя функции дочернего класса как параметра методу родительского класса в pythonic?

3) Я хочу убедиться, что после каждого вызова функции из производного класса сохраняйте каждый результат и имя функции и времени exectuted в хранилище базового классаResult во вложенном словаре, например {function: {result: time}}.

Я немного разбираюсь в python, спасибо заранее.

ответ

0

Используйте декоратор , который будет обертывать названные методы.

from collections import defaultdict 
from datetime import datetime 
from functools import wraps 


def store_result(method): 
    @wraps(method) 
    def wrapped(self, *args, **kwargs): 
     result = method(self, *args, **kwargs) 
     self.storeResult(method.__name__, result, str(datetime.now())) 
     return result 

    return wrapped 


class Base(object): 
    def __init__(self): 
     self.results = defaultdict(dict) 

    def storeResult(self, function_name, result, executed_time= None): 
     self.results[function_name][result] = executed_time 


class Derived(Base): 
    @store_result 
    def sum(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     return a + b 

    @store_result 
    def diff(self, a, b): 
     print 'In derived!' 
     return a - b 

    @store_result 
    def multiply(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     return a * b 

    @store_result 
    def divide(self, a, b): 
     print 'In derived!' 
     a = 0 
     b = 0 
     return a/b 

Я использовал defaultdict для хранения результатов - это позволяет пропускание фабричной функции отсутствующих ключей при назначении значений.

+0

Большое спасибо за быстрый ответ! не могли бы вы рассказать мне после каждого вызова функции из производного класса, сохранить каждый результат и имя функции и времени exectuted в Base Class store Store в вложенном словаре, например {function: {result: time}}. Я новичок в python. помогите с этим –

+0

Обернутый метод уже вызывает 'storeResult' с правильными аргументами. Все, что вам нужно сделать, это создать dict в вашем '' __init__' методе класса Base, чтобы все экземпляры его имели отдельный dict. Затем в 'storeResult' просто назначьте правильные значения этому dict. –

+0

Не могли бы вы отредактировать свой ответ, это немного сложно для начинающих, чтобы понять. –

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