2013-05-07 54 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__发生的原因是设置类中的引用将替换整个描述符引用。

我建议不要过分防御性编程,仅仅是因为其他代码可以在有或没有您的协助下找到任何出错的方法。这足以防止出现令人意外的结果,而不是防止积极的滥用。

相关问题