Python重写getter而不使用setter
我希望能够重写该属性,但能够使用超级父级的setter,而不必重写子类中的setter pythonicaly可能吗?只使用原始属性的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(
.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