Python overriding getter without setter

限于喜欢 提交于 2019-11-26 09:46:07

问题


class human(object):
    def __init__(self, name=\'\'):
        self.name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

class superhuman(human):
    @property
    def name(self):
        return \'super \' + name

s = superhuman(\'john\')
print s.name

# Doesn\'t work :( \"AttributeError: can\'t set attribute\"
s.name = \'jack\'
print s.name

I want to be able to override the property but be able to use the super parent\'s setter without having to override the setter in the child class.

Is that pythonicaly possible?


回答1:


Use just the .getter decorator of the original property:

class superhuman(human):
    @human.name.getter
    def name(self):
        return 'super ' + self._name

Note that you have to use the full name to reach the original property descriptor on the parent class.

Demonstration:

>>> class superhuman(human):
...     @human.name.getter
...     def name(self):
...         return 'super ' + self._name
... 
>>> s = superhuman('john')
>>> print s.name
super john
>>> s.name = 'jack'
>>> print s.name
super jack

The property descriptor object is just one object, even though it can have multiple methods associated with it (the getter, setter and deleter). The .getter, .setter and .deleter decorator functions provided by an existing property descriptor return a copy of the descriptor itself, with that one specific method replaced.

So in your human base class what happens is that you first create the descriptor with the @property decorator, then replace that descriptor with one that has both a getter and a setter with the @name.setter syntax. That works because python decorators replace the original decorated function with the same name, it basically executes name = name.setter(name). See How does the @property decorator work? for the details on how that all works.

In your subclass you simply use that trick to create a new copy of the descriptor with just the getter replaced.



来源:https://stackoverflow.com/questions/15785982/python-overriding-getter-without-setter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!