2013-12-11 68 views
1

我正在嘗試創建一種將前綴應用於修改項目現有統計信息的項目的方法。例如,在下面的代碼中,我試圖將'巨大'前綴應用於'jar'項目。我想讓代碼可重用,這樣我就可以擁有不同的前綴('快速','健康'),可以修改不同的項目統計信息。參考類成員的變量 - Python

  • 是否可以在變量中保存類成員的名稱?
    • 如果是這樣,有什麼理由我不應該?
    • 如果沒有,還有什麼替代方案?
class Prefix(object): 
    def __init__(self, word, stat, valu): 
     self.word = word 
     self.stat = stat 
     self.valu = valu 


class Item(object): 
    def __init__(self, name, size): 
     self.name = name 
     self.size = size 
    def apply_prefix(self, prefix): 
     self.prefix.stat += prefix.valu # <-- Here is my issue 
     self.name = prefix.word + ' ' + self.name 
     # My hope is to make the code reusable for any stat 
    def print_stats(self): 
     print self.name, self.size 


def main(): 
    jar = Item('jar', 10) 
    huge_prefix = Prefix('huge', 'size', 5) 
    jar.apply_prefix(huge_prefix) 
    jar.print_stats() 
+0

你是什麼意思的「持有類成員」的名字? – aIKid

+0

如果項目類可能具有大小或速度,我希望前綴類stat變量指向大小或速度。這將允許我使用一行代碼而不是一堆if語句。 – Jehy

回答

1

你試圖動態參考一些屬性。你通過使用getattr來做到這一點。如果你想設置屬性,嗯......這是setattr :)

def apply_prefix(self, prefix): 
    target_attr = getattr(self,prefix.stat) #dynamically gets attr 
    setattr(self,prefix.stat,target_attr+prefix.valu) 

至於這是否是最好的編碼風格:它依賴。有些例子通過使用getattr使代碼變得更清楚。既然現在你只有兩個統計,似乎過度需要這種動態屬性的引用,因爲我可以很容易做到:

bogus_prefix = Prefix('huge','bogus',3) 

這是一個有效Prefix,而是拋出一個AttributeError當我嘗試將其應用。這不是調試最直接的事情。

但是,getattr方法有獎金:如果添加更多的統計信息,則不必在Prefix中更改一些代碼(haha)。

其他選擇? Python中有總是選項。 :-)

方式我會這樣做是否使Prefix只是dict字:值對。然後apply_prefix會循環鍵字,更新一次所需的值。這是一種類似的動態方法,但更具可擴展性。

+0

這動態獲取正確的值,但現在我怎樣才能動態地將它分配給'self。(prefix stat)',以便'jar.size'等於'15'? – Jehy

+0

@好吧,那就是'setattr'。請參閱編輯。 – roippi

+0

編輯:看起來像我發現答案就像你評論。謝謝! – Jehy