Pythonプライベート属性、プライベートメソッド

7247 ワード

Pythonプライベート属性、プライベートメソッド
プライベート属性、メソッド--Pythonは本格的なプライベート化のサポートはありませんが、下線で偽プライベートを得ることができます.実際の開発では、クラスのいくつかの属性やメソッドはオブジェクトの内部でのみ使用されたい場合がありますが、外部でプライベート属性にアクセスしたくない場合はありません.つまり、クラスが公開を望んでいない属性プライベートメソッドは、クラスが公開を望んでいない方法です.
PythonはJavaのようにprivate修飾子を使用してプライベート属性を作成することはできませんが、Pythonにはサブクラスが意外にも「プライベート」属性を上書きすることを避ける簡単なメカニズムがあります.たとえば、moodインスタンスプロパティが内部に使用されているDogというクラスがありますが、オープンしていません.Dogクラスのサブクラス:Beagleが作成されました.知らないうちにmoodというインスタンス属性を作成すると、継承メソッドでDogクラスのmood属性が上書きされます.これはデバッグが難しい問題です.このような状況を避けるために、moodの形式(2つのプリアンブル下線、末尾に1つの下線がないか、または最大1つの下線がある)でインスタンス属性を命名し、Pythonは属性名をインスタンスの__に格納します.dict __ プロパティに下線とクラス名が付けられます.したがって、Dogクラスにとって、_moodはDog_になりますmood;Beagleクラスにとっては_Beagle__mood.この言語特性を名前書き換え(name mangling)と呼ぶ.単一下線「最初のメンバー変数を保護変数と呼びます.クラスオブジェクト(クラスインスタンス)とサブクラスオブジェクトのみがこれらの変数にアクセスでき、クラスが提供するインタフェースでアクセスする必要があります.'from module import*'で二重下線をインポートできません」から始まるのはプライベートメンバー(変数、方法)で、クラスオブジェクトのみがアクセスできることを意味します.このデータにはサブクラスオブジェクトもアクセスできません.
class Person:   
    _a = 'hello'  #    ,         
    #"     "              ,        (    )               ,             ;   'from module import *'  
    __b = 'world'  ##    
    #"      "         (  、  ),             ,               。
    name = 'gaozhiyuan'
gaozhiyuan = Person()
print(Person.__dict__) #             Python            __dict__    ,                
print(Person._a,gaozhiyuan._a)
gaozhiyuan._a = 7  #                    
print(gaozhiyuan._a,Person._a)#           ,                   ,       
print(gaozhiyuan.name)
print(gaozhiyuan._Person__b)
#                      
gaozhiyuan._Person__b = 8  #                        ,                  "_  "
print(gaozhiyuan._Person__b,Person._Person__b)
{'__module__': '__main__', '_a': 'hello', '_Person__b': 'world', 'name': 'gaozhiyuan', '__dict__': , '__weakref__': , '__doc__': None}
hello hello
7 hello
gaozhiyuan
world
8 world

pythonインスタンスはPythonの共有メソッドを直接呼び出すことができる.プライベートメソッドとプロパティは、外部で直接プロパティまたはメソッド名で呼び出すことはできません.内部ではプライベートメソッドとプロパティを前に「_クラス名」を追加します.
print(dir(Person))
['_Person__b', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_a', 'name']

プライベート属性も変更できますが、一般的には変更しません.
#             ,        
class Person:   
    _a = 'hello'  #    ,         
    #"     "              ,        (    )               ,             ;   'from module import *'  
    __b = 'world'  ##    
    #"      "         (  、  ),             ,               。
    name = 'gaozhiyuan'
gaozhiyuan = Person()
Person._a = 9
print(Person._a,gaozhiyuan._a)  #           ,         
Person._Person__b = 10
print(Person._Person__b,gaozhiyuan._Person__b)#           ,         
9 9
10 10