2013-03-18 32 views
1

的錯誤我有下面這段代碼賬戶持有碼在python私人attribute_class

class AccountBannk: 
    def __init__(self,balance,holder): 
     self.__AccountHolder=holder 
    def Display_AccountHolder(self): 
     print "account holder is" , self.__AccountHolder 
myaccount=AccountBannk(100000,"mehdiebagvand") 
#print myaccount.__AccountHolder #is a error 
myaccount.__AccountHolder="ali" 
print myaccount.__AccountHolder  #print ali 

是私有屬性
和蟒蛇,我們不能直接編輯或打印。
,如果我們嘗試下面的代碼,蟒蛇釋放錯誤

print myaccount.__AccountHolder 

,但我的問題是
1 - 爲什麼蟒蛇不在下面的代碼釋放錯誤

myaccount.__AccountHolder="ali" 

2-I打印我的帳戶.__帳戶持有人在end_line但python不釋放錯誤
並將myaccount .__ AccountHolder的值更改爲'ali'

+0

將其更改爲'ali',然後調用'Display_AccountHolder()'。 – Blender 2013-03-18 21:33:09

+0

Display_AccountHolder()工作良好,但我的問題是另一個 – 2013-03-18 21:35:29

+0

那麼,Display_AccountHolder()'打印出來什麼? – Blender 2013-03-18 21:36:03

回答

3

這不是一個錯誤。當你在你的課堂上定義你的第一個__AccountHolder時,Python正在改變變量的名字(使其很難猜出,但不是真正的私人,請參閱PEP-8)。當你附加你的第二個__AccountHolder時,你正在創建一個新的變量(帶有一個新的變形名稱)。試試這個看:

print myaccount.__AccountHolder 
print myaccount.Display_AccountHolder() 

或者添加

print dir(myaccount) 

之前和之後做第二次分配,像這樣:

>>> myaccount=AccountBannk(100000,"mehdiebagvand") 
>>> dir(myaccount) 
    ['Display_AccountHolder', '_AccountBannk__AccountHolder', '__doc__', '__init__', '__module__'] 
>>> myaccount.__AccountHolder="ali" 
>>> dir(myaccount) 
    ['Display_AccountHolder', '_AccountBannk__AccountHolder', '__AccountHolder', '__doc__', '__init__', '__module__'] 

至於這名字改編,在這裏它是從該文檔:

__double_leading_underscore:命名時一個類屬性,調用名稱改變(在類FooBar中,__boo變成FooBar _boo;見下面的 )。

1

這其中的原因是多方面的,我相信它的方式更多的麻煩比它的價值使用__names爲「私有變量」之一。 __names的預期用例更多地允許層次結構中的類使用nice(ish)名稱,而不必擔心層次結構中其他類正在使用哪些名稱,而不是創建「私有」屬性。

對於「私有」屬性,只需使用單引號下劃線(如_name)。這表明您的意圖是某些名稱是私有實現細節,而其他名稱是該類的公共接口的一部分。它不會阻止任何人使用「私人」的名字,但__names既不是,因爲mangling是非常容易反向工程。所有這些技巧之一是防止任何人從意外使用使用你想要的私人名稱;他們可以做些狡猾的事情,但他們必須知道他們在做這件事。這是你可以用Python獲得的所有東西;因爲一切都是動態的,任何人都可以隨時做任何事情。

所以__name_name您專用的內部名稱之間的主要區別是,__name將成爲一個主要的PITA每當你開始想要使用getattrhasattr(甚至是在正確的類),動態附加方法,或有子確實想分享「私人」的名字。帶有單個下劃線的_name在任何這些區域都沒有問題,在記錄您的意圖方面同樣有效,並且在防止專用名稱在類定義之外使用方面同樣有效(即幾乎完全無效)。