美文网首页
Python super的一个坑

Python super的一个坑

作者: doyoubi | 来源:发表于2015-07-03 17:04 被阅读185次

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

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 */
    ....
}

相关文章

网友评论

      本文标题:Python super的一个坑

      本文链接:https://www.haomeiwen.com/subject/hxryqttx.html