看板 Python 關於我們 聯絡資訊
我在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
aweimeow: sm._StateMachine__state = "MOV" 10/14 11:11
aweimeow: 這樣就可以改了,只是很不好 XD 10/14 11:11
aweimeow: 然後 sm.__state / sm._StateMachine__state 不一樣 10/14 11:12
aweimeow: 所以原本放 sm.__state = "MOV" 的話 10/14 11:12
aweimeow: 再加一行 print(sm.__state) 就能看到 MOV 10/14 11:13
icetofux: 好像有點想通了,所以第10行的sm.__state = "MOV"只是 10/14 11:34
icetofux: 產生一個全新的物件叫做sm.__state,然後對它賦值"MOV" 10/14 11:35
icetofux: 對嗎? 10/14 11:35
aweimeow: 就是幫 sm 這個物件加上一個 __state 屬性並賦值 10/14 11:40
aweimeow: 可以 print(dir(sm)) 會發現他多出屬性了 XD 10/14 11:40
qiubite31: 要實作類似private屬性,用property來作setter和getter 10/15 10:52
qiubite31: 應該比較好 10/15 10:52
qiubite31: y 10/15 10:53
qiubite31: 拍謝我縮一下https://goo.gl/Z4McqF 10/15 10:54