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でプライベート属性を取得します.