作者icetofux ()
看板Python
標題[問題] 隱藏類別中的屬性
時間Fri Oct 14 10:38:52 2016
我在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