コードがあります:
class A:
@staticmethod
def g():
A.__z = 4
print(dir(A))
A.g()
print(dir(A)) # A has attribute _A__z
A.__m = 5
print(dir(A)) # A has attribute _A__z and __m
名前__m
がマングルされていない_A__m
のはなぜ__z
ですか?
コードがあります:
class A:
@staticmethod
def g():
A.__z = 4
print(dir(A))
A.g()
print(dir(A)) # A has attribute _A__z
A.__m = 5
print(dir(A)) # A has attribute _A__z and __m
名前__m
がマングルされていない_A__m
のはなぜ__z
ですか?
Python のチュートリアルでは次のように説明されています。
このマングリングは、クラスの定義内で発生する限り、識別子の構文上の位置に関係なく行われます。
class
名前マングリングは、構文的にステートメント内にあるコードのコンパイル時に発生します。class
ステートメント外のコードでは発生しません。class
ステートメントの外部で定義され、クラス オブジェクトに追加された関数内のコードでは発生しません。ステートメント内のexec
またはeval
呼び出しによって動的に実行されるコードでは発生しません。class
まさにクラス外で宣言したため、クラス内で名前マングリングが発生します。