Re: [問題] property override的困擾

看板Python作者 (tytyty)時間10年前 (2015/08/19 14:34), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《kentyeh (kent)》之銘言: : 最近在學習Python,碰到 setter 與 getter override的困擾 : 首先以下是 Parent 的設定 : class Parent(): : @property : def foo(self): : return self._bar : @foo.setter : def foo(self, foo): : self._bar = foo : 然後是繼承者Child : class Child(Parent): : def getFoo(self): : return "Overrides:"+super().foo : def setFoo(self, foo): : self._bar = ' '.join(['Child\'s foo:', foo]) : foo=property(getFoo,setFoo) : 用以下程式測試 : child = Child() : child.foo="Hello World" : print(child.foo) : 取得預期的結果: : Overrides:Child's foo: Hello World : 以下只Override setter : class Child(Parent): : @Parent.foo.setter : def foo(self, foo): : self._bar = ' '.join(['Child\'s foo:', foo]) : 或是只Override getter : class Child(Parent): : @Parent.foo.getter : def foo(self): : return "Override getter:"+self._bar : 也都可以得到預期的結果 : 但是組合起來後 : class Child(Parent): : @Parent.foo.getter : def foo(self): : return "Override getter:"+self._bar : @Parent.foo.setter : def foo(self, foo): : self._bar = ' '.join(['Child\'s foo:', foo]) : 卻只得到 : Child's foo: Hello World : 有先進可以解惑嗎? 首先來個線上跑扣頁面 http://goo.gl/0G1JFE 重點已經註解在扣裡面了,搭配測試結果應該很容易了解。 其實需要知道的只是 decorator 不過是一種 syntactic sugar,下面這兩段扣 意思是一樣的。 #1 @property def foo(self): return self._foo #2 def foo(self): return self._foo foo = property(foo) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.234.217.60 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1439966089.A.3D4.html

08/19 17:23, , 1F
辛苦了,但仍不理解為什麼但Child2的setter置換後會連同
08/19 17:23, 1F

08/19 17:24, , 2F
getter一起換掉,而Child1卻不會?
08/19 17:24, 2F

08/19 23:52, , 3F
因為decorator的來源不一樣,Child1的setter用的是Parent
08/19 23:52, 3F

08/19 23:53, , 4F
裡的foo property,Child2當要decorate setter時把自己的
08/19 23:53, 4F

08/19 23:54, , 5F
foo property拿來用,所以不會把置換過的getter丟掉。
08/19 23:54, 5F
文章代碼(AID): #1Lr2E9FK (Python)
討論串 (同標題文章)
文章代碼(AID): #1Lr2E9FK (Python)