2014-03-06 67 views
1

我想要在Python中創建和設置屬性屬性的值。Python中的可鏈接動態屬性

下面是一個例子:

book = Dynamic() 
book.chapter1.section2 = 'abc' 

我的書的對象不具有第一章屬性,所以當SETATTR被稱爲它必須創建。我已經得到這個工作:

book = Dynamic() 
book.chapter1 = SubDynamic() 
book.chapter1.section2 = 'section 2' 

我不能然而,弄清楚如何加入成一條線沒有得到一個錯誤,告訴我,第一章不存在。

這是我得到的。

class Dynamic(object): 
     def __setattr__(self, name, value): 
       sn = SubDynamic(value) 
       self.__dict__[name] = v 

class SubDynamic(object): 
     def __init__(self, attr): 
       value = "" 
       self.attr = value 

     def __setattr__(self, name, value): 
       self.__dict__[name] = value 

if __name__ == '__main__': 
     book = Dynamic() 
     book.chapter1.section2 = 'abc' 

回答

5

我覺得你可以只實施__getattr__這簡化了一下:

class Dynamic(object): 
    def __getattr__(self, name): 
     sub = Dynamic() 
     setattr(self, name, sub) 
     return sub 


>>> book = Dynamic() 
>>> book.chapter1.section2 = 'abc' 
>>> book.chapter1 
<test.Dynamic object at 0x7feb0f697910> 
>>> book.chapter1.section2 
'abc' 
+0

簡單的比我能想到 - 我只會進一步解釋(其它reders /的OP),其__getattrr__只是在實例中不存在屬性時調用。因此,進一步讀取動態創建的屬性或其他屬性不會導致它被此方法破壞。 (檢查Python文檔中的__getattribute__'來控制每個屬性訪問) – jsbueno