2016-06-10 16 views
1

我試圖以高效和Pythonic的方式在類(包括它們的初始值設定項)和方法中實現重複的功能。Python類,初始值設定項和方法中的重複功能/代碼

我是繼承和覆蓋方法(如看到here)。我有櫃檯定義和增強每個類的作業。

我的代碼

class StructuralAnalysis(object): 
    def __init__(self): 
     self.counter_results = [] # probably a dict would be better 

    def generate_structural_metrics(self): 
     # declare counters 
     cnum = 0 
     cstr = 0 
     cbytes = 0 
     ... 
     ... 
     ... 

     for node in ast.walk(self.tree): 
      if isinstance(node, ast.Num): 
       cnum += 1 
      elif isinstance(node, ast.Str): 
       cstr += 1 
      elif isinstance(node, ast.Bytes): 
       cbytes += 1 
      elif ... 
      elif ... 
      elif ... 

      self.counter_results = [cnum, cstr, cbytes, .......] 
      # some counters may require some further calculations 

      return self.counter_results 

我的問題是上述可以以更Python和/或有效的方式來實現;就像每個計數器有不同的類方法,每個重寫的方法將調用它來執行增強的分配?這是爲了避免大量的計數器聲明和重複代碼。任何建議都會很棒。

+0

您是否正在尋找python中的元編程? – biobirdman

+0

@biobirdman不知道那是什麼。只是探索在類中實現重複功能的'最佳'方法真的.. –

回答

1

我不會使用一堆類,因爲開銷可能太大(假設大多數只保留一個計數器,對於那種類型)。但是,我會檢查是否有一種方法通過函數來​​獲得ast類型(所以不是isinstance的布爾值,而是類型(var)。當你有ast類型時,你可以使用你已經擁有的字典如想法寫類似

counters = {} 
for node in ast.walk(self.tree): 
    counters[type(node)] += 1 

這將通過所有節點進行迭代,並添加計數器到字典中

對於額外的計算,你可以再拍詞典:

counter_calculations = {} 

counter_calculations[ast.BYTE] = perform_additional_calculations_byte 

對於每種類型,如果有需要的功能,則添加函數引用。這樣你就可以很容易地調用一個類型所需的額外計算(你可以在同一個迭代器中使用它)。

if (type(node) in counter_calculations: 
    counter_calculations[type(node)]() 

然後實現的功能,例如用於字節:

def perform_additional_calculations_byte(byte_node): 
    ... some calculations 

有關計數器的成績來回報你可以返回櫃檯字典。

+0

我很難理解你的建議(Python中的新手)。作爲一個例子,你能花幾分鐘的時間來實現你對我說的小代碼塊的看法嗎? –

+0

我的所有代碼適應了我認爲是您正在尋找的解決方案(或者我錯過了代碼塊?) –

+0

我明白你的建議。非常聰明。但是,對於這種特定情況,我確實需要進行所有'isinstance'檢查,所以我想這對我來說不是一個理想的解決方案。如果沒有其他建議,我會接受你的回答。 –

相關問題