1
前段时间我开发了一个python应用程序,并且在我的类中使用了很多属性,但是当我尝试覆盖派生类中基类的访问器的行为时遇到了麻烦。这是我的问题的草图: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
当我ru n这个我得到:
John
Mr. John
这就是我想要的,但问题是,_fix_name
是在类的外部访问,除了它是一个额外的方法,我需要添加为每个属性访问我要重写,等
所以问题是: 有没有一些“好”的方式来做到这一点?或者,有没有解决这个问题的PEP? 我觉得某种@overrides
修饰器可以解决这个问题吗?
哦,一个非常简单的解决方案,我不知道为什么,当我试图完全一样并没有为我过去的工作!但它的权利!谢谢 –