作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] 隐藏类别中的属性
时间Fri Oct 14 11:40:26 2016
※ 引述《icetofux ()》之铭言:
: 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())
Python 的 self.__member 并不会造成这个成员被隐藏, 而是会触发 name mangling:
https://en.wikipedia.org/wiki/Name_mangling#Python
>>> class Foo:
... def __init__(self):
... self.__member = 'member'
... def get_member(self):
... return self.__member
>>> foo = Foo()
>>> [attr for attr in dir(foo) if 'member' in attr]
['_Foo__member']
>>> foo._Foo__member
'member'
当你在 instance method 中对 self.__member 赋值时
Python 会改把资料存到 _Foo__member
进而造成 class 外的程式无法用 foo.__member 取值 (但可以用 foo._Foo__member)
当你在 class 外的程式对 foo.__member 赋值, 则并不会触发 name mangling
>>> foo.__member = 'outside'
>>> [attr for attr in dir(foo) if 'member' in attr]
['_Foo__member', '__member']
>>> foo.__member
'outside'
>>> foo._Foo__member
'member'
这两个成员是分开的
当你在 Foo class 里面的 instance method 使用 self.__member 取值时
仍然会触发 name mangling, 进而取到 _Foo__member
注:
Python 文件有特别注明这个 mangling 行为只是用来防止继承时的意外覆写
但因为这个 mangling 规则过於 naive, 其实还是很容易出意外
所以一般而言会建议使用 p-member 或完善文件来对付这个问题
而对於你这种 scope management 而言, 更是强烈不建议使用 name mangling
--
作者 Linux (Windows) 看板 C_and_CPP
标题 [问题] 如何确认是否 free 对记忆体
时间 Fri Nov 2 00:14:03 2012
1F:→ akasan:valgrind, 但 windowns 版的没试过XD 11/02 00:43
2F:→ akasan:linux 上那真的是不二选择了 11/02 00:44
3F:→ Linux:我是用 Windows ....>"< 11/02 00:45
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.19.12
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1476416429.A.E14.html
4F:推 Typebrook: 感谢解说,之前看文件都没想到这个地步 10/14 12:46
5F:推 aweimeow: 推 10/14 13:49
※ 编辑: uranusjr (140.112.94.57), 10/14/2016 13:51:16