Python重写getter方法但没有setter方法

35
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

我希望能够覆盖属性,但是在不必覆盖子类的setter方法的情况下,能够使用父类的setter方法。

这是否在Python中可行?

1个回答

53

仅使用原始属性的.getter装饰器:

class superhuman(human):
    @human.name.getter
    def name(self):
        return 'super ' + self._name
注意,您必须使用完整名称才能访问父类上的原始属性描述符。
演示:
>>> 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
property 描述符对象是一个对象,即使它可以有多个关联的方法(getter、setter 和 deleter)。现有 property 描述符提供的 .getter.setter.deleter 装饰器函数返回描述符本身的一个副本,并替换其中一个特定的方法。
因此,在您的基类 human 中,您首先使用 @property 装饰器创建描述符,然后使用 @name.setter 语法将其替换为具有 getter 和 setter 的描述符。这是行得通的,因为 Python 装饰器用相同名称替换原始装饰函数,它基本上执行了 name = name.setter(name)。有关所有这些工作方式的详细信息,请参见如何使用 @property 装饰器? 在您的子类中,只需使用该技巧创建一个仅 getter 已替换的新描述符的副本即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接