このコードがあります:
class A:
__x = 2
def f(self):
print(dir(self)) # there is attribute _A__x, but not __x
print(self.__x) # prints 2
print(self._A__x) # prints 2
x = A()
x.f()
print(x.__x) # AttributeError: 'A' object has no attribute '__x'
__x
変数へのアクセスは、このメソッドのようなメソッド内では許可されているself.__x
が、このメソッドの外では許可されていないのはなぜですか? アンダースコアが 2 つある名前が壊れていることは知っていますが、問題は、self
属性として壊れたバージョンしかないのに、この壊れていないバージョンがメソッド内で機能するように何が特別なのかということです。
編集:
_A__name
たとえば、フォームの名前でクラスに属性が追加されていることに気付きました。
class A:
_A__y = 3
def f(self):
print(self.__y) # prints 3
print(self._A__y) # prints 3
x = A()
x.f()
次に、クラス内では、たとえばインタープリターが変数__y
を検索するときに名前も使用できるように見えるため_A__y
、プレフィックス_A
は C++ のスコープ解決のように機能するようA::
です。しかし、それがどのように機能するかについての詳細はわかりません。
したがって、元の質問を拡張できます。なぜこの場合、 altough のみが定義さself.__y
れているのと同じ効果があるのですか?self._A__y
_A__y