Python super的一个坑

在知乎上看到以下代码不能工作

class Base(object):
    def __init__(self):
        self._value = 10
    def __repr__(self):
        return 'Value(%s)' % self._value
    @property
    def value(self):
        return self._value
    @value.setter
    def value(self, v):
        self._value = v
        

class Derived(Base):
    @property
    def value(self):
        return super(Derived, self).value * 2
    @value.setter
    def value(self, v):
        super(Derived, self).value = v / 2

Derived的super(Derived, self).value = v / 2会抛异常
AttributeError: 'super' object has no attribute 'value'
查了CPython的代码发现原来super这个代理类没有实现赋值操作符,只是实现了取值tp_getattro

PyTypeObject PySuper_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "super",                                    /* tp_name */
    ....
    super_getattro,                             /* tp_getattro */
    0,                                          /* tp_setattro */
    ....
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容