2011-10-31 23 views
3

我正在學習學習Python第4版,我目前正在爲本書的第六部分進行練習。我目前的練習有點讓人困惑,我希望能夠得到一些關於如何解決這個問題的指導。如何通過子類來攔截操作?

下面是我正在使用的提示。

子類。在練習2中創建一個名爲MyListSub的MyList子類,該子類擴展了MyList,以便在調用每個重載操作之前將消息打印到stdout並計算調用次數。 MyListSub應該繼承MyList的基本方法行爲。向MyListSub添加序列應該會打印一條消息,爲+調用增加計數器,並執行超類的方法。另外,引入一種將操作計數器打印到stdout的新方法,並交互式地對您的類進行實驗。你的計數器是否按每個實例或每個類(針對該類的所有實例)計數調用?你將如何編程其他選項)? (提示:這取決於哪個對象計數成員被分配到:類成員被實例共享,而是自我成員是每個實例的數據。)

所以部分,我真正感興趣的,現在是

從練習2中創建一個名爲MyListSub的MyList的子類,它擴展了MyList以在調用每個重載操作之前將消息打印到stdout並計算調用次數。

我可以在這裏看到DRY的良好用法,它可以一石激起我的所有鳥類。但我不知道如何實現它。 我知道我應該做的是實現某種攔截操作,增加計數器並打印消息的方法。但我不知道如何去做最好的事情。我的基本想法是一樣的東西

def count_ops(self, op_count): 
    # intercept calls to operator overloading methods 
    op_count += 1 
    print 'Number of calls to operator {0}: {1}'.format(oper, op_count) 

(注:這不是我一直沒有寫代碼,這是邊界僞突出什麼,我想做的事情。)

我能得到一些幫助這裏?請不要直接給我答案,我想弄明白這一點,提示遠遠超出答案。 :)

回答

1

提示:

def count(cls): 
    for attr in (attr for attr in dir(cls) if not attr.startswith('_')): 
     method = getattr(cls,attr) 
     if callable(method): 
      setattr(cls,attr,func_count(method,attr)) 
    return cls 
+1

我已經有了這樣的解決方案,我希望進一步解耦它,這樣我就不必在每個重載的方法中加入一些東西。 – wldcordeiro

+1

你可以用類裝飾器來做到這一點。 – unutbu

1

是你的重載的方法做任何事情,除了計算呼叫別的嗎?換句話說,你是否必須寫他們?如果是的話,你可以使用裝飾器,或只是一個獨立的函數,並從每個方法調用它。

如果子類中唯一需要的重載是計數,您可以查看__getattribute__。需要警告 - 這有點複雜,在您將其用於生產代碼之前,您需要了解它。其他選項包括class decoratormetaclass以包裝您關心的每種方法。