推 timTan:大推,其待整理成完整文章 05/08 00:33
→ timTan:不過間接呼較也太折磨人了 05/08 00:34
→ timTan:錯字...呼叫! 05/08 00:35
其實改用 property decorator 就可以防呆了
沿用之前的例子, 改用 decorator
(1) Subclass 複寫了 getter 的 method, 卻沒有把它變成 property
class Foo(object):
@property
def var(self):
return 10
class Bar(Foo):
def var(self):
return 20
bar = Bar()
print bar.var # <bound method Bar.var of <__main_.Bar object ...
# Obviously doesn't make sense
(2) 使用間接呼叫
class Foo(object):
def _get_var(self):
return 10
@property
def var(self):
return self._get_var()
class Bar(Foo):
def _get_var(self):
return 20
bar = Bar()
print bar.var # 20
(3) Subclass 也加上 property
class Foo(object):
@property
def var(self):
return 10
class Bar(Foo):
@property
def var(self):
return 20
bar = Bar()
print bar.var # 20
使用新的 decorator 只要注意一件事情
就是 override property method 時也要放 decorator
其實舊方法也是一樣
只要在 override 時重新產生 property(方法三)基本上就 OK
如果你只想複寫 getter/setter/deleter 其中之一時, 舊方法會有點醜
不過做這種事情通常也不太合理
--
╱ ̄ ̄ ̄╲
▏◢█◣ ▏
︻█︻█ ▏ 成龍表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
※ 編輯: uranusjr 來自: 114.32.81.146 (05/08 01:48)
推 timTan:這樣寫的話的確簡單且直覺多了~ 05/09 20:34