2013-10-31 71 views
0

我想要做動態地從外部源創建名稱繼承對象

考慮到與行的文件:

A B C value 
A B D value 

是否有可能創建一個將能夠結構acccess值是這樣的:

A.B.C.val() 
A.B.D.val() 

考慮到A, B, C, D是容器(如表格,窗口等),我會喜歡能夠通過使用這種結構獲得每個元素路徑。

就是我要問

最後,我想知道的是,如果有一個類(比方說generic),我可以創建一個名爲A(名稱的繼承類從讀文件,可以是任何東西)在運行時會停止存在(最後一部分並不重要)?

+0

我真的有一個很難理解什麼這裏的最後一段與你寫剩下的東西做的。你認爲你可以做一個更具體的例子嗎? – mgilson

+0

第一部分是我想要做的,然後我想了一下,然後問了一些能讓我想要嘗試的東西。我保留第一部分只是爲了看看是否有人認爲這只是愚蠢的,或在 – CosminO

回答

2

這是你在找什麼?

# Generic class definition 
class Generic (object): 
    value = None 
    @classmethod 
    def val(cls): 
     return int(cls.value) 

# Top level class 
TopLevelClass = type('TopLevelClass', 
        (Generic,), {}) 

lines = ["A B C 42", 
     "A B D 43"] 

for line in lines: 
    # Parse the line 
    path = line.split()[:-1] 
    value = line.split()[-1] 
    # Create the classes 
    current = TopLevelClass 
    for x in path: 
     if hasattr(current,x): 
      current = getattr(current,x) 
     else: 
      cls = type(x, (Generic,), {}) 
      setattr(current,x,cls) 
      current = cls 
    # Apply value 
    setattr(cls,'value',value) 


# Test 
print(TopLevelClass.A.B.C.val()) 
print(TopLevelClass.A.B.D.val())  

輸出:

>>> 42 
>>> 43 
+0

似乎正確之前完成了。我會檢查它並讓你知道。 感謝您的回答! – CosminO

+0

我剛剛編輯我的答案來處理幾行,請檢查出 – Vincent

+0

作品!現在想弄清楚我想做什麼... – CosminO