2013-01-10 77 views
4

我模仿ConfigParser模塊的行爲來編寫一個高度專用的解析器,該解析器利用配置文件中某些定義良好的結構來處理與我一起工作的特定應用程序。該文件遵循標準INI結構:我可以部分重寫__setattr__嗎?

[SectionA] 
key1=value1 
key2=value2 

[SectionB] 
key3=value3 
key4=value4 

我的應用程序,該部分在很大程度上是無關緊要的;不同部分的鍵之間沒有重疊,並且所有用戶都只記住鍵名,而不是從哪個部分進入。因此,我想要替換MyParser類中的__getattr____setattr__。允許這樣的快捷鍵:

​​

__setattr__方法將首先嚐試找到一個名爲key2部分並將其設置爲「富」,如果它的存在。假設沒有這樣的部分,它會在每個部分的內部查找名爲key2的密鑰。如果密鑰存在,則將其設置爲新值。如果它不存在,解析器將最終產生一個AttributeError

我已經構建了這個的測試實現,但問題是,我也想要一些免除這種行爲的直接屬性。我想config.filename是一個簡單的字符串,其中包含原始文件的名稱,並且config.content是包含每個部分的字典的字典。

是否有一種簡潔的方法來在構造函數中設置filenamecontent屬性,以避免被我的自定義getter和setter忽略?在調用自定義__setattr__之前,python是否會在對象的__dict__中查找屬性?

回答

5

filenamecontent超類來處理它

class MyParser(object): 
    def __setattr__(self, k, v): 
     if k in ['filename', 'content']: 
      super(MyParser, self).__setattr__(k, v) 
     else: 
       # mydict.update(mynewattr) # dict handles other attrs 
+0

我不喜歡保持這些列表「的想法'__setattr__'方法中的「特殊」屬性。它看起來像我可以在構造函數中使用超級構造來定義它們,然後讓它們正常工作; '打印config.filename'做正確的事情。然而,設置屬性不起作用,因爲它會下降到自定義的__setattr__中,並最終導致拋出和錯誤。爲什麼python在獲取時會捕獲該屬性,但在設置時不會捕獲該屬性? –

+1

如果你不想在'__setattr__'中定義它們,那麼你總是可以定義一個類屬性(例如'MyParser.specials'而不是一個文字列表),但是代碼流是相同的。至於爲什麼獲得作品,是不是因爲'__getattr__'沒有在這些例子中定義? – Cartroo

+0

@Cartroo我實際上指的是我自己在做的一些測試,我確實已經實現了這些方法。原來,這是因爲我重複了'__getattr__'的邏輯,其中'return'語句將代碼的執行結束到'__setattr__'中,這些'return'語句現在設置變量而不終止執行。所以我認識到的差異是我的錯誤,而不是基本的Python行爲。 –

2

我想這可能是清潔呈現類似字典的接口文件的內容,並離開屬性供內部使用的訪問。但是,這只是我的看法。

要回答你的問題,__setattr__()__dict__檢查之前調用,這樣你就可以實現它是這樣的:

class MyParser(object): 

    specials = ("filename", "content") 

    def __setattr__(self, attr, value): 
     if attr in MyParser.specials: 
      self.__dict__[attr] = value 
     else: 
      # Implement your special behaviour here 
相關問題