Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python重写getter而不使用setter_Python_Oop_Properties_Setter_Getter - Fatal编程技术网

Python重写getter而不使用setter

Python重写getter而不使用setter,python,oop,properties,setter,getter,Python,Oop,Properties,Setter,Getter,我希望能够重写该属性,但能够使用超级父级的setter,而不必重写子类中的setter pythonicaly可能吗?只使用原始属性的.getter装饰器: class human(object): def __init__(self, name=''): self.name = name @property def name(self): return self._name @name.setter def name(

我希望能够重写该属性,但能够使用超级父级的setter,而不必重写子类中的setter

pythonicaly可能吗?

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

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
请注意,必须使用全名才能访问父类上的原始属性描述符

演示:

class superhuman(human):
    @human.name.getter
    def name(self):
        return 'super ' + self._name
属性
描述符对象只是一个对象,即使它可以有多个与之关联的方法(getter、setter和deleter)。现有的
属性
描述符提供的
.getter
.setter
.deleter
装饰器函数返回描述符本身的副本,并替换该特定方法

因此,在
human
基类中,首先使用
@属性
装饰器创建描述符,然后用既有getter又有setter的描述符替换该描述符,该描述符具有
@name.setter
语法。这是因为python装饰器用相同的名称替换了原来的装饰函数,它基本上执行
name=name.setter(name)
。请参阅,以了解有关所有操作的详细信息

在子类中,您只需使用该技巧创建描述符的新副本,而只替换getter

>>> 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