2017-09-26 72 views
0

我有一個包含列表和一些布爾方法的類。從變量調用新對象的方法

class Cls: 
    data = [] // populated in __init__() 


    def flag1(self): 
    def flag2(self): 
    def flag3(self): # these all return booleans, based on the data 

我想建立一個更高層次的功能,進行參數的標誌之一,在多種方式操縱數據,應用該標誌到新的數據,並計算結果的數量。

喜歡的東西:

def hof(self, fn): 
    count = 0 
    for i in range(1, 10): 
    new_obj = Cls(self.data+i) 
    if new_obj.fn(): 
     count +=1 

有沒有辦法做到這一點不打開所有的標誌爲靜態方法?

=== 編輯:使工作在一個非常hackish的方式:

class Cls: 
    data = [] 
    def __init__(self): 
    self.data = value 
    class flag1(self): 
    return True 
    class flag2(self): 
    return False 

    # The hackish part 
    flag_dict = { 
    1: flag1, 
    2: flag2, 
    } 
    def hof(self, flag): 
    count = 0 
    for i in range(1,10): 
     new_obj = Cls(self.data + [i]) 
     if self.flag_dict[flag](new_obj): 
     count +=1 
    return count 

但它似乎是一個黑客,這不是很容易理解。有人能指出一個更好的方法嗎?

謝謝。

+0

你有什麼試過,發生了什麼?當我在這裏的時候,當你說'__init __()'中的類級可變變量被「填充」時,你的意思是「用期望的值替換」,在這種情況下,它可能應該有不同的默認值,以包含所需的值「,在這種情況下,每個實例將具有相同的數據? – mwchase

+0

@mwchase,我的意思是'def __init __(self,value):self.data = value' – pashadia

回答

0

您應該能夠將方法傳遞到像instance.hof(Cls.flag1)這樣的函數中,並且在內部將其寫入if fn(new_obj):,而無需將其作爲靜態方法。

+0

這應該可以工作,不需要像我這樣的字典。 – pashadia