2013-12-13 102 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

哦,一個非常簡單的解決方案,我不知道爲什麼,當我試圖完全一樣並沒有爲我過去的工作!但它的權利!謝謝 –