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
修飾器可以解決這個問題嗎?
哦,一個非常簡單的解決方案,我不知道爲什麼,當我試圖完全一樣並沒有爲我過去的工作!但它的權利!謝謝 –