Python:缺失的存取控制?

來源:互聯網
上載者:User

不知為何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: 存取控制 : 語言和平台

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.