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

回答編集履歴

1

追記

2019/05/14 06:52

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,4 +1,4 @@
1
- アンダースコアが二つ付いた変数はマングリングされます。
1
+ アンダースコアが二つ付いた~~変数~~識別子はマングリングされます。
2
2
  ただし外部から新たに属性を加える場合はそのままです。
3
3
  ```Python
4
4
  >>> class MyClass:
@@ -17,4 +17,37 @@
17
17
  2
18
18
  ```
19
19
 
20
- 別のオブジェクトとして扱われているのが分かります。
20
+ 別のオブジェクトとして扱われているのが分かります。
21
+
22
+ コメントを受けて
23
+ ---
24
+ > この両者(`self.__attr` と `inst.__attr`)は違うのでしょうか
25
+
26
+ hayataka2049さんが引用されている文章の中に、次のような記述があります。
27
+ > クラス定義内に書かれた識別子で ...後略
28
+
29
+ 単に**どこに書かれているか**が問題なわけです。
30
+ 次のコードでもそれを確認することができます。
31
+ ```Python
32
+ class MyClassA:
33
+ def __init__(self, inst):
34
+ inst.__attr = 42
35
+
36
+
37
+ class MyClassB:
38
+ def __init__(self):
39
+ pass
40
+
41
+
42
+ b = MyClassB()
43
+ a = MyClassA(b)
44
+
45
+ print(vars(b))
46
+ ```
47
+
48
+ **実行結果** [Wandbox](https://wandbox.org/permlink/AT7PudyVCGQwBlUK)
49
+ ```
50
+ {'_MyClassA__attr': 42}
51
+ ```
52
+
53
+ MyClassBの属性なのに、MyClassAの名前を冠されているのはなかなか面白い挙動ですね。