1

私は以下のコードを持っています

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

このコードでは、AccountHolderはプライベート属性
であり、Pythonでは直接編集または印刷することはできません。
以下のコードを試してみると、Pythonはエラーをリリースします

print myaccount.__AccountHolder

しかし、私の質問は
1-Pythonが以下のコードでエラーをリリースしない理由

myaccount.__AccountHolder="ali"

2-myaccount .__ AccountHolderをend_lineに出力しますが、Pythonはエラー
を解放せず、myaccount.__AccountHolderの値を「ali」に変更します

4

2 に答える 2

3

これはバグではありません。クラス内で最初に定義するとき__AccountHolder、Python は変数の名前をマングリングします (推測するのは難しくなりますが、真に非公開にはなりません。 PEP-8を参照してください)。2番目をアタッチする__AccountHolderと、新しい変数が作成されます(新しいマングル名で)。これを試してください:

print myaccount.__AccountHolder
print myaccount.Display_AccountHolder()

または追加

print dir(myaccount)

次のように 2 番目の割り当てを行う前後に、次のようにします。

>>> 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 になります。以下を参照してください)。

于 2013-03-18T21:34:14.830 に答える
1

これは、「プライベート変数」として使用する価値があるよりもはるかに面倒だと私が信じる多くの理由の 1 つです__namesの使用例は__names、「プライベート」属性を作成するのではなく、階層内の他のクラスが使用している名前をあまり気にせずに、階層内のクラスがナイス (っぽい) 名を使用できるようにすることを目的としています。

「プライベート」属性の場合は、先頭に単一のアンダースコア ( など_name) を使用します。これは、特定の名前はプライベート実装の詳細であり、他の名前はクラスのパブリック インターフェイスの一部であるという意図を示しています。「プライベート」名の使用を妨げるものではありません__names。これらの手法はすべて、非公開にするつもりだった名前を誰かが誤って使用するのを防ぐだけです。彼らは危険なことをすることができますが、彼らはそれをしていることを知る必要があります. Python で取得できるのはこれだけです。すべてが動的であるため、とにかくいつでも誰でも何でもできます。

したがって、プライベート内部名__nameとの主な違いは、使用したい、または(正しいクラス内であっても)メソッドを動的にアタッチしたり、「プライベート」を共有したいサブクラスを持ったりするたびに、主要な PITA になることです。名前。アンダースコアが 1 つの場合は、これらの領域のいずれにおいても問題がなく、意図を文書化するのに効果的であり、クラス定義の外でプライベート名が使用されるのを防ぐのに効果的です (つまり、ほとんど効果がありません)。_name__namegetattrhasattr_name

于 2013-03-18T21:57:16.307 に答える