Re: [问题] 隐藏类别中的属性

楼主: uranusjr (←這人是超級笨蛋)   2016-10-14 11:40:26
※ 引述《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
作者: Typebrook (Pham)   2016-10-14 12:46:00
感谢解说,之前看文件都没想到这个地步
作者: aweimeow (喵喵喵喵 ヽ( ・∀・)ノ)   2016-10-14 13:49:00
作者: akasan (KITO)   2016-11-02 00:43:00
valgrind, 但 windowns 版的没试过XDlinux 上那真的是不二选择了
作者: Linux (Windows)   2016-11-02 00:45:00
我是用 Windows ....>"<

Links booklink

Contact Us: admin [ a t ] ucptt.com