2013-05-07 58 views
4

想象一下,我這有Python descriptorPython描述符的__set__可以用instance = None調用嗎?

class MyDesc(object): 
    def __get__(self, instance, instance_type=None): 
     return 'Blue berries' 
    def __set__(self, instance, value): 
     print 'called with', instance, value 

class MyClass(object): 
    desc = MyDesc() 

是否有東西塔爾__set__的正常運行方式會得到調用None爲實例論證?我的意思是沒有做這樣的事情

MyClass.__dict__['desc'].__set__(None, 'ants bees cats') 

這些似乎並沒有做到這一點:

MyClass.desc = 'blah' 
setattr(MyClass, 'desc', 'blah') 

我之所以問的是我看到一些defensive coding in Django來避免這種情況,而且我質疑它是否是必要。

回答

3

我認爲你是正確的質疑這個測試,並且我找不到instance在這個代碼中的None。該文件似乎也明確表示instance永遠不能None

object.__set__(self, instance, value) 

調用對一個實例所有者類instance設置屬性到一個新的價值,value

我的猜測是,instance__get__檢查Nonea good reason,而同樣的測試結束了在__set__由純粹的模仿性。

0

至於防禦性編碼,我看到一些代碼檢查__get__(它被調用MyClass.desc),但不在__set__上有一個實例。它不會與__set__發生的原因是設置類中的引用將替換整個描述符引用。

我建議不要過分防禦性編程,僅僅是因爲其他代碼可以在有或沒有您的協助下找到任何出錯的方法。這足以防止出現令人意外的結果,而不是防止積極的濫用。

相關問題