前一段时间,我正在开发一个python应用程序,并且在类中使用了很多属性,但是当我尝试在派生类中重写基类的访问器的行为时,我遇到了麻烦。这是我的问题的草图:
class Person(object):
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
class Mr(Person):
@name.setter
def name(self,value):
self._name = "Mr. "+value
p = Person()
p.name = "John"
print p.name
m = Mr()
m.name = "John"
print m.name
当您运行它时,会出现以下错误:
Traceback (most recent call last):
File "/home/user/Desktop/bad.py", line 20, in <module>
class Mr(Person):
File "/home/user/Desktop/bad.py", line 22, in Mr
@name.setter
NameError: name 'name' is not defined
当我遇到这个问题时,我没有时间找到答案,我只是使用简单的getters和setters或重新考虑我的逻辑,因此我不需要重写访问器,但是现在我试图回答我的问题并学习到目前为止,我只发现了一些方法:
class Person(object):
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = self._fix_name(value)
def _fix_name(self,value):
return value
class Mr(Person):
def _fix_name(self,value):
return "Mr. "+value
p = Person()
p.name = "John"
print p.name
m = Mr()
m.name = "John"
print m.name
当我运行它时,我得到:
John
Mr. John
这就是我想要的,但是问题是_fix_name
在类外部可以访问,除了它是我需要为要覆盖的每个属性访问器添加的额外方法,等等。
因此,问题是:是否有某种“好的”方法来做到这一点?或者,是否有任何PEP可以解决此问题?我认为某种@overrides
装饰器可以解决问题?
class Mr(Person):
@Person.name.setter
def name(self,value):
self._name = "Mr. "+value
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句