[問題] @property

看板Python作者 (nahgnimiast)時間5年前 (2019/07/26 14:44), 5年前編輯推噓1(1015)
留言16則, 5人參與, 5年前最新討論串1/4 (看更多)
我在class中使用@property, 但是log不會印,應該沒有被呼叫到 問題看起來跟tkinter.Frame有關,使用class item(object)就 可以正常使用,請問不會動的原因和該如何修改?謝謝 (使用python2.7) class item(tkinter.Frame): @property def level(self): print 'get property level' return self._level @level.setter def level(self, value): print 'set property level:', value self._level = value -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.146.57.196 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1564123473.A.470.html ※ 編輯: tsaiminghan (122.146.57.196 臺灣), 07/26/2019 14:48:34

07/26 15:33, 5年前 , 1F
他不是函式吧……
07/26 15:33, 1F

07/26 15:59, 5年前 , 2F
我改一下,總之就是不會被叫到
07/26 15:59, 2F
※ 編輯: tsaiminghan (122.146.57.196 臺灣), 07/26/2019 16:00:28

07/26 18:49, 5年前 , 3F
撞名了?
07/26 18:49, 3F

07/26 23:04, 5年前 , 4F
最粗淺的原因是因為 tkinter.Frame 沒有繼承到 object
07/26 23:04, 4F

07/26 23:05, 5年前 , 5F
也就是他是所謂的 old-style/classic classes
07/26 23:05, 5F

07/26 23:32, 5年前 , 6F
實際上是 item 和他的父類別都找不到 __setattr__
07/26 23:32, 6F

07/26 23:35, 5年前 , 7F
item 的實例就會把 instance.__dict__ 裡面加上 "level"
07/26 23:35, 7F
因為我python是看code上網查語法,沒有整體學過,請問上面這一段是old-style class 的作法嗎? 所以@property不能用在old-style class嗎?

07/27 00:59, 5年前 , 8F
不要再用Python2了
07/27 00:59, 8F
沒辦法,前人的code就是python2 ※ 編輯: tsaiminghan (220.136.176.135 臺灣), 07/27/2019 06:34:05

07/27 11:23, 5年前 , 9F
目前想到的方法 1. 複寫 item class __setattr__
07/27 11:23, 9F

07/27 11:23, 5年前 , 10F
2. 直接讓 item 用多重繼承 object...
07/27 11:23, 10F

07/27 11:25, 5年前 , 11F
不過 2. 會有甚麼副作用 可能要看一下多重繼承XD
07/27 11:25, 11F

07/27 11:36, 5年前 , 12F
剛看了一下: 文件上有寫: https://bit.ly/2Y8jIjX
07/27 11:36, 12F

07/27 11:37, 5年前 , 13F
看這個第二段的最後一句: "Note that descriptors are"
07/27 11:37, 13F

07/27 11:37, 5年前 , 14F
"only invoked for new style objects or classes"
07/27 11:37, 14F

07/27 11:38, 5年前 , 15F
所以你要做的事情,要嘛讓他是隻鴨子,或是讓他像隻鴨子
07/27 11:38, 15F

07/27 18:46, 5年前 , 16F
謝謝,我會用settatr去試試看。
07/27 18:46, 16F
文章代碼(AID): #1TEg5HHm (Python)
文章代碼(AID): #1TEg5HHm (Python)