2010-06-14 111 views
1

我有點新的Python,我不知道是否有創造的東西像魔術方法PHP的方式(http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods魔術方法在Python

我的目的是緩解兒童類的訪問中我的模型。我基本上有一個有n個子類的父類。這些類有三個值,一個語言鍵,一個翻譯鍵和一個翻譯值。這些描述了一種通用的翻譯處理。父類可以用不同的語言翻譯不同的翻譯密鑰。例如。關鍵「標題」可以翻譯成德語和英語,也可以將關鍵詞「描述」(迄今爲止等等)

我不想獲取子類和過濾器的設置值(至少我希望但不是明確的,神奇方法背後的具體實現會做到這一點)。我想致電

parent_class.title['de'] 
# or also possible maybe 
parent_class.title('de') 

獲得德語(德)的標題翻譯。

所以必須有一個神奇的方法,採用被調用方法的名稱和他們的參數(如在PHP中)。就我挖掘Python而言,這隻能通過簡單的屬性(__getattr__,__setattr__)或直接在類中設置/獲取(__getitem__,__setitem__)來實現,這些都不符合我的需求。

也許有這樣的解決方案?請幫忙! 在此先感謝!

回答

4

返回具有__getitem__方法的parent_class.title對象。

class parent_class: 
    def __init__(self): 
     self.title = multilang("hello world"); 

class multilang: 
    def __init__(self, text): 
     pass 
    def __getitem__(self, key): 
     if key == 'en': 
      return "hello world"; 
+0

好,這是我沒有想到的解決方案,但我必須考慮一些其他環境的事實,我沒有提到它適合的極端好到我的需要;) 感謝您的支持! – dArignac 2010-06-14 12:22:47

1

你可以重構你的代碼到parent_class['de'].title。然後,像這樣的工作probaly

from collections import defaultdict 

class X(object): 
    def __init__(self, title = "", description = ""): 
     self.title = title 
     self.description = description 

parent_class = defaultdict(X) 

parent_class['en'] = X("title", "description") 
parent_class['de'].title = "Titel" 
+0

良好的解決方案,但不幸的是不能在我的環境中工作,因爲我有一些限制。不過謝謝你! – dArignac 2010-06-14 12:23:25