python直接アクセスクラスのプライベート属性またはメソッド

1489 ワード

class Attr():
    def __init__(self):
        self.arg1 = 'public'
        self.__arg2 = 'private'
print(Attr().arg1)              #public
#print(Attr().__arg2)            #  , 'Attr' object has no attribute '__arg2
print(Attr()._Attr__arg2)  #private

Attrクラスではarg 1が公有属性,arg 2が私有属性である.公開属性は直接アクセスできますが、プライベート属性に直接アクセスすると「Attr'object has no attribute'_arg 2」というエラーが表示されます.pythonがプライベート属性の名前を変更したためです.dir()メソッドを使用してprivateの組み込みメソッドとプロパティを表示します.
print(dir(Attr()))

結果は次のとおりです.
['_Attr__arg2', '__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__', 'arg 1']では、python内部にプライベート__が表示されます.arg 2は'_に変更されましたAttr_Arg 2'(_クラス名__属性名)は、プライベート属性やメソッドに直接アクセスできないため、Attr().Attr__arg 2は、プライベート属性にアクセスします.
 
要約:pythonには本当にプライベート化された属性はありませんが、_privateはプロパティをプライベート化しましたが、_クラス名_属性名はプライベート属性を取得するため、擬似プライベートに属します.しかし、この方法でプライベート属性にアクセスするのではなく、getterメソッドまたは@propertyでプライベート属性を取得します.