2013-12-13 63 views
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修饰器可以解决这个问题吗?

回答

4
class Mr(Person): 

    @Person.name.setter 
    def name(self,value): 
     self._name = "Mr. "+value 
+0

哦,一个非常简单的解决方案,我不知道为什么,当我试图完全一样并没有为我过去的工作!但它的权利!谢谢 –