4

想象一下,我有这个Python 描述符

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')

我问的原因是我在 Django 中看到了一些防御性编码来避免这种情况,我在质疑是否有必要。

4

2 回答 2

3

我认为你对这个测试提出质疑是对的,我也找不到instance进入None这个代码的方法。该文档似乎也清楚地表明instance永远不可能None

object.__set__(self, instance, value)

调用以将所有者类的实例instance上的属性设置为新值value

我的猜测是,这instance有充分理由None,而且同样的测试以纯粹的模仿而告终。__get____set__

于 2013-05-07T08:27:52.380 回答
0

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

我建议不要过度防御性编程,因为不管有没有你的帮助,其他代码都可以找到任何出错的方法。这足以防止令人惊讶的结果,而不是防止主动滥用。

于 2014-03-25T20:31:35.637 回答