[問題] 隱藏類別中的屬性

看板Python作者時間7年前 (2016/10/14 10:38), 編輯推噓2(2013)
留言15則, 3人參與, 最新討論串1/2 (看更多)
我在python 3.5.1的環境下做了一個簡單的測試,想要做到類似其他程式語言中 "private"的功能: test.py 1 class StateMachine: 2 def __init__(self): 3 self.__state = "IDLE" 4 5 def state(self): 6 return (self.__state) 7 8 sm = StateMachine() 9 print(sm.state()) 10 sm.__state = "MOV" 11 print(sm.state()) 輸出結果如下: c:\python test.py IDLE IDLE --- 因為__state是被隱藏的,我原本預期在第10行去對__state賦值會出錯,但意外的在沒 回報任何問題的情況下執行結束,雖然__state的內容沒被改變依然沒違反原本的用意 ,但我很好奇為什麼對一個被隱藏起來(看不見)的屬性賦值可以被通過呢?這樣會不會 很容易在寫code的時候發生以為值有寫進去、但實際上因為目標是被隱藏起來的屬性而 值根本沒改變的狀況呢? 順帶一提如果第10行改為: print(sm.__state) 在執行階段報錯,這應該可以表示__state有確實的被隱藏起來。 最近剛開始一邊查資料一邊學python,如果問了蠢問題還請見諒。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.212.239 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1476412734.A.46D.html

10/14 11:11, , 1F
sm._StateMachine__state = "MOV"
10/14 11:11, 1F

10/14 11:11, , 2F
這樣就可以改了,只是很不好 XD
10/14 11:11, 2F

10/14 11:12, , 3F
然後 sm.__state / sm._StateMachine__state 不一樣
10/14 11:12, 3F

10/14 11:12, , 4F
所以原本放 sm.__state = "MOV" 的話
10/14 11:12, 4F

10/14 11:13, , 5F
再加一行 print(sm.__state) 就能看到 MOV
10/14 11:13, 5F

10/14 11:34, , 6F
好像有點想通了,所以第10行的sm.__state = "MOV"只是
10/14 11:34, 6F

10/14 11:35, , 7F
產生一個全新的物件叫做sm.__state,然後對它賦值"MOV"
10/14 11:35, 7F

10/14 11:35, , 8F
對嗎?
10/14 11:35, 8F

10/14 11:40, , 9F
就是幫 sm 這個物件加上一個 __state 屬性並賦值
10/14 11:40, 9F

10/14 11:40, , 10F
可以 print(dir(sm)) 會發現他多出屬性了 XD
10/14 11:40, 10F

10/15 10:52, , 11F
要實作類似private屬性,用property來作setter和getter
10/15 10:52, 11F

10/15 10:52, , 12F
應該比較好
10/15 10:52, 12F

10/15 10:53, , 14F
y
10/15 10:53, 14F

10/15 10:54, , 15F
拍謝我縮一下https://goo.gl/Z4McqF
10/15 10:54, 15F
文章代碼(AID): #1O04K-Hj (Python)
文章代碼(AID): #1O04K-Hj (Python)