想象一下,我有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来避免这种情况,我在质疑是否有必要。
答案 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__
不会发生的原因是在类中设置引用会替换整个描述符引用。
我建议不要过度防御性编程,只是因为其他代码可以在有或没有您的帮助的情况下找到出错的方法。它足以防止出现令人惊讶的结果,而不是防止主动滥用。