亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Python的“私有”方法實際上不是私有的?

為什么Python的“私有”方法實際上不是私有的?

慕桂英546537 2019-06-23 15:47:12
為什么Python的“私有”方法實際上不是私有的?Python使我們能夠通過在名稱前加上雙下劃線來創建類中的“私有”方法和變量,如下所示:__myPrivateMethod()..那么,如何解釋這一點呢?>>> class MyClass:...     def myPublicMethod(self):...             print 'public method'...     def __myPrivateMethod(self):...              print 'this is private!!'... >>> obj = MyClass()>>> obj.myPublicMethod()public method           >>> obj.__myPrivateMethod()Traceback (most recent call last):   File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod'>>> dir(obj)['_MyClass__myPrivateMethod', '_   _doc__', '__module__', 'myPublicMethod']>>> obj._MyClass__myPrivateMethod()this is private!!怎么回事?!我給那些不太明白的人解釋一下。>>> class MyClass:...     def myPublicMethod(self):...             print 'public method'...     def __myPrivateMethod(self):...              print 'this is private!!'... >>> obj = MyClass()我所做的就是用一個公共方法和一個私有方法創建一個類并實例化它。接下來,我稱之為它的公共方法。>>> obj.myPublicMethod()public method接下來,我嘗試調用它的私有方法。>>> obj.__myPrivateMethod()Traceback (most recent call last):   File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod'這里一切都很好,我們不能稱之為。事實上,它是‘私人的’。其實不是。跑迪爾()在對象上,揭示了python為您的所有“私有”方法神奇地創建的一種新的神奇方法。>>> dir(obj)['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']此新方法的名稱始終是下劃線,后面是類名,后面是方法名。>>> obj._MyClass__myPrivateMethod()this is private!!封裝就這么多了,嗯?在任何情況下,我都聽說Python不支持封裝,那么為什么還要嘗試呢?什么給予?
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊


名稱置亂用于確保子類不會意外地覆蓋其超類的私有方法和屬性。它的設計并不是為了防止故意從外部進入。


例如:


>>> class Foo(object):

...     def __init__(self):

...         self.__baz = 42

...     def foo(self):

...         print self.__baz

...     

>>> class Bar(Foo):

...     def __init__(self):

...         super(Bar, self).__init__()

...         self.__baz = 21

...     def bar(self):

...         print self.__baz

...

>>> x = Bar()

>>> x.foo()

42

>>> x.bar()

21

>>> print x.__dict__

{'_Bar__baz': 21, '_Foo__baz': 42}

當然,如果兩個不同的類有相同的名稱,它就會分解。


查看完整回答
反對 回復 2019-06-23
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

私有函數示例

import reimport inspectclass MyClass :

    def __init__(self) :
        pass

    def private_function ( self ) :
        try :
            function_call = inspect.stack()[1][4][0].strip()

            # See if the function_call has "self." in the begining
            matched = re.match( '^self\.', function_call )
            if not matched :
                print 'This is Private Function, Go Away'
                return
        except :
            print 'This is Private Function, Go Away'
            return

        # This is the real Function, only accessible inside class #
        print 'Hey, Welcome in to function'

    def public_function ( self ) :
        # i can call private function from inside the class
        self.private_function()### End ###


查看完整回答
反對 回復 2019-06-23
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

當我第一次從Java到Python時痛恨這,這個。把我嚇死了。

今天也許只有一件事我最愛關于Python。

我喜歡在一個平臺上,人們互相信任,不覺得他們需要在代碼周圍建造無法穿透的墻。在強封裝的語言中,如果一個API有一個bug,并且您已經知道出了什么問題,那么您可能仍然無法繞過它,因為所需的方法是私有的。在Python中,態度是:“當然”。如果你認為你了解情況,也許你甚至讀過,那我們只能說“祝你好運!”

請記住,封裝與“安全性”或讓孩子遠離草坪的關系并不弱。這只是另一種模式,應該用來使代碼庫更容易理解。


查看完整回答
反對 回復 2019-06-23
  • 3 回答
  • 0 關注
  • 1015 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號