回答編集履歴

1

追記

2019/05/14 06:52

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,4 +1,4 @@
1
- アンダースコアが二つ付いた変数はマングリングされます。
1
+ アンダースコアが二つ付いた~~変数~~識別子はマングリングされます。
2
2
 
3
3
  ただし外部から新たに属性を加える場合はそのままです。
4
4
 
@@ -37,3 +37,69 @@
37
37
 
38
38
 
39
39
  別のオブジェクトとして扱われているのが分かります。
40
+
41
+
42
+
43
+ コメントを受けて
44
+
45
+ ---
46
+
47
+ > この両者(`self.__attr` と `inst.__attr`)は違うのでしょうか
48
+
49
+
50
+
51
+ hayataka2049さんが引用されている文章の中に、次のような記述があります。
52
+
53
+ > クラス定義内に書かれた識別子で ...後略
54
+
55
+
56
+
57
+ 単に**どこに書かれているか**が問題なわけです。
58
+
59
+ 次のコードでもそれを確認することができます。
60
+
61
+ ```Python
62
+
63
+ class MyClassA:
64
+
65
+ def __init__(self, inst):
66
+
67
+ inst.__attr = 42
68
+
69
+
70
+
71
+
72
+
73
+ class MyClassB:
74
+
75
+ def __init__(self):
76
+
77
+ pass
78
+
79
+
80
+
81
+
82
+
83
+ b = MyClassB()
84
+
85
+ a = MyClassA(b)
86
+
87
+
88
+
89
+ print(vars(b))
90
+
91
+ ```
92
+
93
+
94
+
95
+ **実行結果** [Wandbox](https://wandbox.org/permlink/AT7PudyVCGQwBlUK)
96
+
97
+ ```
98
+
99
+ {'_MyClassA__attr': 42}
100
+
101
+ ```
102
+
103
+
104
+
105
+ MyClassBの属性なのに、MyClassAの名前を冠されているのはなかなか面白い挙動ですね。