不知為何Python沒有提供像C++和Java那樣的存取控制,無法控制在module中定義的function和class的可見度;class中定義的function和variable倒是可以通過不少於兩個底線的首碼和不多於一個底線的尾碼標明這是class“私人”的.
在Python中文郵件清單問了一下,感覺至少有三種workaround:
1, 對於class中打算私人的函數定義以兩個底線開頭
class SomeClass:
def pub_func(self):
self.__private_func()
def __private_func(self):
print 'impl'
SomeClass().pub_func()
SomeClass().__private_func() #AttributeError: SomeClass instance has no attribute '__private_func'
2,對於module中打算私人的function或class,定義到單獨的module中,在package的__init__.py中定義__all__,使其不包括這個單獨的module
並且不能在其它module的全域空間中import這個單獨的module;例如,包結構:
util/__init__.py
/private.py
/pub.py
in util/__init__.py:
__all__=["pub"]
in util/private.py
def private_func():
print 'private'
in util/pub.py
def pub_func():
import private
private.private_func()
客戶代碼:
from util import *
pub.pub_func() #ok
private.private_func() #NameError: name 'private' is not defined
但如果客戶from util import private 還是可以使用private module的
3, 將打算私人的代碼以可互動語言編寫擴充,並以二進位提供
以上方法都不盡如人意,基本上,問題是在Python中有沒有存取控制的必要?什麼情況下會有?如果有必要的話應該怎麼控制呢?
我不知道
See also: 存取控制 : 語言和平台