Python学習(15):オブジェクト向け(2)-メンバー可視性


一、メンバーの可視性について
デフォルトでは、クラスの内部で作成された属性と方法で、外部コードはインスタンスを通じて直接操作できます.しかし、パッケージ性を保証するために、これらの内部プロパティが外部から直接アクセスされることを望んでいない場合があります.これには、メンバーの可視性を設定する必要があります.
設定方法:属性とメソッド名の前に下線_を2つ追加します.
役割:外部コードが勝手にオブジェクトの内部の状態を修正できないことを確保し、外部アクセス時にいくつかの許容誤り性の判断をすることができ、コードがより丈夫である.
≪外部アクセス|External Access|emdw≫:プライベートを設定した後も、外部コードがこれらのプライベート属性にアクセスする必要がある場合は、現在のクラスに公開されたgetメソッドとsetメソッドを追加できます.
二、クラスの私有属性と私有方法を実現する
class Student():
    def __init__(self,name,age=18):
        self.name= name
        self.age = age
        self.__restScore() #        
        self.__score = 0   #        

    #    :    
    def __restScore(self):
        self.__score = 50

    #    :    
    def get__score(self):
        print(self.name +"   :"+ str(self.__score))

    #    :    ,             
    def set__score(self,score):
        if score < 0:
            self.__score = 0
            return
        self.__score  = score

メンバーの可視性をテストするコードは次のとおりです.
stu = Student("  ")
#stu.resetScore()    #  ,          
#print(stu.__score) #  ,          

stu.get__score()    #             
stu.set__score(-1)
stu.get__score()    #0
stu.set__score(66)
stu.get__score()    #66

三、私有メンバーの原理を理解する
内部のプライベート属性がPython解釈器によって_に変更されたため、プライベート変数を動的に設定することはできません.Student__score、dictを使用してオブジェクトの内部プロパティを印刷します.コードは以下のとおりです.
print(stu.__dict__) #  stu      
stu.__score = 100   #  __score  
print(stu.__dict__) #  stu      
'''
{'name': '  ', 'age': 18, '_Student__score': 66}
{'name': '  ', 'age': 18, '_Student__score': 66, '__score': 100}
'''

まとめ:外部コードのこの操作は実際に1つ追加されました_score変数は、実際のプライベート属性に影響しません.
四、最後のまとめ
1.Pythonにおける特殊変数Pythonに付随する変数名は類似している」xxx__”は、二重下線で始まり、二重下線で終わる変数で、特殊な変数です.特殊変数はprivate変数ではなく直接アクセスできるので、名前を付けるときに使用するのはお勧めしません.name__、__score__このような形式.
2.二重下線のインスタンス変数は、必ずしも外部からアクセスできないわけではありません.コードに直接アクセスできない場合_scoreはPython解釈器が外部にscore変数が_に変更されましたStudent__score、だから、依然として_を通過することができますStudent__scoreアクセス_name変数ですが、異なるバージョンのPython解釈器では_scoreを異なる変数名に変更します.
3.総じて言えば、Python自体はあなたが悪いことをするのを止めるメカニズムがなく、すべて自覚に頼っています.