コードがあります:
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
まさにクラス外で宣言したため、クラス内で名前マングリングが発生します。