teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

些細

2021/04/10 04:26

投稿

quickquip
quickquip

スコア11327

answer CHANGED
@@ -68,4 +68,4 @@
68
68
  かわりにこれと等価になるように`__dict__`にセットするコードを書こうとすると、そこでセットするべき名前はname-manglingの仕様で**変換された後の名前**でなければなりません。
69
69
 
70
70
  ゆえにダブルアンダースコア名のためname-manglingの再生成が必要
71
- だというのはそういう意味です。
71
+ はそういう意味です。

1

引用を変更

2021/04/10 04:26

投稿

quickquip
quickquip

スコア11327

answer CHANGED
@@ -57,10 +57,9 @@
57
57
  Pythonではname-manglingで解決します。
58
58
  ここはこれ以上解説しません。公式ドキュメントからの引用にとどめます。
59
59
 
60
- [https://docs.python.org/ja/3/reference/expressions.html#index-5](https://docs.python.org/ja/3/reference/expressions.html#index-5)
60
+ [https://docs.python.org/ja/3/tutorial/classes.html#private-variables](https://docs.python.org/ja/3/tutorial/classes.html#private-variables)
61
+ > クラスのプライベートメンバについて適切なユースケース(特にサブクラスで定義された名前との衝突を避ける場合)があるので、名前マングリング (name mangling) と呼ばれる、限定されたサポート機構があります。 `__spam` (先頭に二個以上の下線文字、末尾に一個以下の下線文字) という形式の識別子は、 `_classname__spam` へとテキスト置換されるようになりました。
61
62
 
62
- > クラス定義内に書かれた識別子で、2つ以上のアンダースコアから始まり、末尾が2つ以上のアンダースコアで終わっていないものは、そのクラスの プライベートな名前 とみなされます。プライベートな名前は、コードが生成される前により長い形式に変換されます。この変換によって、クラス名の先頭にアンダースコアがあれば除去し、先頭にアンダースコアを1つ付加し、名前の前に挿入されます。例えば、クラス名 Ham の中の識別子 `__spam` は、`_Ham__spam` に変換されます。
63
-
64
63
 
65
64
  ```python
66
65
  self.__methods = {}