2009-12-22 86 views
1
class a: 
    def __init__(self): 
     self._b()#why here use _b,not b,What's the difference 
     self._c='cccc'#why here use _c,not c,What's the difference 
    def _b(): 
     print 'bbbb' 

a.py是什麼在這個地方_B和B之間的差異

class a: 
    def __init__(self): 
     self._b()#why here use _b,not b,What's the difference 
     self._c='cccc'#why here use _c,not c,What's the difference 
    def _b(self): 
     print 'bbbb' 

b.py

from a import * 
b=a() 
b._b() 
print b._c 

其打印 BBBB BBBB BBBB BBBB CCCC

爲什麼可以打印出這些,不是_b和_c私有變量。

+1

下面有兩種答案。文字和洞察力。有感知力的人試圖預測你真正想問什麼,而文字人士只是回答(寫得不好)的問題。兩者都是有效的,IMO。 – gahooa 2009-12-22 02:39:07

回答

3

差異:

class Foo(object): 

    def regular_method(self): 
     print 'ok' 

    def _soft_private(self): 
     print 'ok' 

    def __mangled_private(self): 
     print 'ok' 

f = Foo() 
f.regular_method() 
# prints ok 
f._soft_private() 
# print ok 
f.__mangled_private() 
# error! no such attribute. BUT: 
f._Foo__mangled_private() 
# prints ok 

所以在本質上沒有真正的「隱私」在python,但使用單下劃線使用自己的API,他是在他自己這樣做,警告開發者大會風險。

0

您會注意到b沒有在任何地方定義。而_b是。

除非你在問爲什麼使用命名約定,在這種情況下,你應該詢問該代碼的作者。

+0

如果您打算倒下,請花時間留下解釋原因的消息。常見的禮節,你知道嗎? – 2009-12-22 02:36:51

+0

簡單的回答一個簡單的問題。沒有錯。 – gahooa 2009-12-22 02:37:46

+0

我沒有downvote,但「下劃線意味着私人」是一個有用的答案。 「詢問該代碼的作者」是沒有幫助的。 – 2009-12-22 02:48:39

0

下劃線僅用於表示變量是私有的。

+0

應該指出,「私人」並不意味着「無法訪問」。這僅僅是Python中使用的約定,僅此而已。如果你真的想要私人的前綴,它有兩個下劃線,但即使如此,它仍然可以訪問;只是不那麼容易。 – jathanism 2009-12-22 03:05:35

-1

該類對象a有一個屬性_b,它在詢問self._b時找到。相同的類對象a沒有屬性b

_bbbeehivezulu不同。

調用self._b時,您將收到參數錯誤,因爲Python會將self作爲綁定方法的第一個參數隱式傳遞。簽名應該是:

def _b(self): 
    print('bbbb') 
+0

這是一種方法,而不是屬性。考慮修改你的文章 – inspectorG4dget 2009-12-22 02:40:35

+0

@ inspectorG4dget:'_b'顯然是類對象的一個​​屬性。如果您覺得有疑問,請閱讀「內置類型」的文檔。從該屬性返回的值將是可調用的(一種綁定方法)。這只是讓Python如此偉大的一件事情! – gahooa 2009-12-22 14:03:33

8

每PEP8(http://www.python.org/dev/peps/pep-0008/),單下劃線旨在表示一個「通常私人」方法或屬性。解釋器本身與單個下劃線沒有交互作用,它更多的是一種約定。雙下劃線OTOH在解釋器中具有重要意義。

10

使用下劃線前綴變量或函數名是Python中的一種慣例,表示變量是私有的。從the docs

私有「實例變量,除了從對象內部不能訪問,不存在於Python中。但是,大多數Python代碼都遵循一個約定:以下劃線(例如_spam)作爲前綴的名稱應被視爲API的非公開部分(無論它是函數,方法還是數據成員) 。它應該被視爲實施細節,如有更改,恕不另行通知。

4

基本上,這個想法是,在Python約定中,有三個級別的封裝/隱藏。

  1. 公共屬性和方法:這些是爲了讓其他類無限制地訪問。

  2. 私有屬性和方法(以下劃線爲前綴):這些是爲了隱藏外部世界。下劃線的作用類似於警告:除非你真的知道你在做什麼,否則你不應該觸摸這種方法。首先,這用於區分最終用戶(小人物)和其他開發人員。

  3. 還有第三個層次叫做mangled。任何不屬於該代碼的作者都不會觸及任何被破壞的屬性/方法。程序的核心功能很重要,不應該被觸及,因爲如果它被濫用,那麼它可能會導致不必要的/無法計劃的行爲。

在你的情況下,'_b'方法是一個私有方法。這段代碼的作者希望讓你知道,這不是爲了公共使用,而是如果你正在爲這個類編寫一個包裝器或者這種類型的東西(基本上如果你是開發者使用這個類的話),那麼你可以使用它方法。否則,你最好不要。

此外,變量(或方法)前面的單個下劃線將其綁定到該類。所以當調用a._b時,解釋器會在類a的定義中查找它。單,雙下劃線之間

相關問題