【问题标题】:Can a Python descriptor's __set__ ever get called with instance = None?Python 描述符的 __set__ 可以用 instance = None 调用吗?
【发布时间】:2013-05-07 06:35:01
【问题描述】:

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

【问题讨论】:

    标签: python descriptor


    【解决方案1】:

    我认为你对这个测试提出质疑是对的,我也找不到在这段代码中让instance 成为None 的方法。文档似乎也清楚表明instance 永远不能是None

    object.__set__(self, instance, value)
    

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

    我的猜测是,None__get__ 中检查了instance 中的a good reason,而同样的测试最终在__set__ 中被完全模仿。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多