可以使用instance = None调用Python描述符的__set__吗?

时间:2013-05-07 06:35:02

标签: python descriptor

想象一下,我有Python descriptor

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来避免这种情况,我在质疑是否有必要。

2 个答案:

答案 0 :(得分:3)

我认为您对此测试提出质疑是正确的,我也无法在此代码中找到instance成为None的方法。该文档似乎也清楚地表明instance永远不会是None

object.__set__(self, instance, value)
     

要求将所有者类的实例instance 上的属性设置为新值value

我的猜测是instance None __get__ __set__检查{{1}} {{1}} {{1}} {{1}} {}} {}}

答案 1 :(得分:0)

至于防御性编码,我看到一些代码检查__get__上有一个实例(MyClass.desc被调用但不在__set__上)。它与__set__不会发生的原因是在类中设置引用会替换整个描述符引用。

我建议不要过度防御性编程,只是因为其他代码可以在有或没有您的帮助的情况下找到出错的方法。它足以防止出现令人惊讶的结果,而不是防止主动滥用。