2013-04-03 29 views
0

我正在使用第三方的一個很好的小python模塊,而且我碰到了一點讓我的大腦都扭曲了,而且我最關心的是數據完整性。從方法返回自我.__ dict__

快速總結:有,大約去爲這樣一類方法:

def as_dict(self): 
    ##adjust some attributes that don't make sense outside this scope   
    ##... ... ... 
    return self.__dict__ 

我手動使用這種方法的結果,但也有在那裏我將它傳遞了幾個地方,和我有不知道這些函數實際上對返回的字典做了什麼。

現在,這是安全的,還是可能有一些流浪的功能開始搞亂我的實例屬性?我原本以爲'自我'以某種方式保護了數據集,並且我傳遞了數據的副本,但是現在我想知道是否會傳遞實例內存的引用? (有內嵌套mutables)

我應該做的,而不是:return copy.deepcopy(self.__dict__)

+0

您是否測試過您在代碼中描述的行爲? – sean

+0

我還沒有,而且在這一點上我完全無法做到這一點。我想在編輯這個函數的時候會提出一些警告,因爲這看起來像是一個等待發生的問題。自我.__ dict__以任何方式特別對待,還是僅僅是一本字典? – user2097818

回答

2

你是對的,實例字典像任何其他字典一樣是完全可變的。像這樣返回字典是不常見的。出於某種原因,它可能會在實例之外被修改。似乎它可能是一個糟糕的設計,但。

有時人們會這樣做,因爲他們認爲它比使用全局變量更好。

複製並不是一個很好的解決方法。它可能非常緩慢,只是隱藏了潛在的設計問題

複製的替代方法是包裝字典,以防意外修改。

+0

實現此方法的類確實提供了字典的接口(儘管它不會繼承)。包括__getitem__,get,has_key,items,...(再次,不繼承)。那麼作者是否已經採取了預防措施,或者說自己是裸體可以這麼說? – user2097818

+0

我挖了一下,我認爲第三方模塊正在用dict返回值提供JSON/XML轉換。我想他們現在已經足夠安全......不過謝謝。 – user2097818

1

如果你想確保關於通過副本,copy.deepcopy(self.__dict__)將要走的路。