作者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://webptt.com/cn.aspx?n=bbs/Python/M.1476412734.A.46D.html
1F:推 aweimeow: sm._StateMachine__state = "MOV" 10/14 11:11
2F:→ aweimeow: 这样就可以改了,只是很不好 XD 10/14 11:11
3F:→ aweimeow: 然後 sm.__state / sm._StateMachine__state 不一样 10/14 11:12
4F:→ aweimeow: 所以原本放 sm.__state = "MOV" 的话 10/14 11:12
5F:→ aweimeow: 再加一行 print(sm.__state) 就能看到 MOV 10/14 11:13
6F:→ icetofux: 好像有点想通了,所以第10行的sm.__state = "MOV"只是 10/14 11:34
7F:→ icetofux: 产生一个全新的物件叫做sm.__state,然後对它赋值"MOV" 10/14 11:35
8F:→ icetofux: 对吗? 10/14 11:35
9F:→ aweimeow: 就是帮 sm 这个物件加上一个 __state 属性并赋值 10/14 11:40
10F:→ aweimeow: 可以 print(dir(sm)) 会发现他多出属性了 XD 10/14 11:40
11F:推 qiubite31: 要实作类似private属性,用property来作setter和getter 10/15 10:52
12F:→ qiubite31: 应该比较好 10/15 10:52
14F:→ qiubite31: y 10/15 10:53