前段时间我正在开发一个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
当我遇到这个问题时,我没有时间找到答案,我只是使用普通的getter和setter或重新考虑我的逻辑,所以我不需要覆盖访问器,但现在我想回答我的问题并且在一些书中学习,到目前为止我只发现了这种方法:
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
装饰可以解决这个问题吗?
答案 0 :(得分:5)
class Mr(Person):
@Person.name.setter
def name(self,value):
self._name = "Mr. "+value