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

回答編集履歴

1

誤字修正

2019/10/20 10:14

投稿

nico25
nico25

スコア830

answer CHANGED
@@ -6,31 +6,43 @@
6
6
  これは既に質問文に挙動を示されているので、ご存知の通りです。
7
7
 
8
8
  また第二に、変数の代入に関わるフックがありません。
9
- 属性の代入に関わるフックはあるのですが
9
+ 属性の代入に関わるフックはあるのですが...
10
10
 
11
+ `__getattr__`, `__setattr__` などが該当するかなと思います。
11
12
 
13
+
12
14
  #### ◯ 代替案
13
15
  リストや辞書の要素、あるいはクラスの属性として持たせることです。
16
+ これはこれで面倒で、質問の意図から反してしまっていますが。
14
17
 
15
18
  ```python
19
+ list_a = [0]
16
- lst = ['a']
20
+ list_b = list_a
21
+
22
+ list_b[0] = 1
17
- lst[0] = 'b'
23
+ list_a[0] == 1 # True
18
- assert lst[0] == 'b'
19
24
  ```
20
25
  ```python
21
- dct = {0: 'a'}
26
+ dict_a = {0: 0}
27
+ dict_b = dict_a
28
+
29
+ dict_b[0] = 1
22
- dct[0] = 'b'
30
+ dict_a[0] == 1 # True
23
- assert dct[0] == 'b'
24
31
  ```
25
32
  ```python
26
- class Cls: pass
33
+ class Class: pass
27
34
 
28
- obj = Cls()
35
+ object_0 = Class()
29
- obj.attr = 'a'
30
- obj.attr = 'b'
36
+ object_1 = object_0
37
+
38
+ object_1.attribute = 1
31
- assert obj.attr == 'b'
39
+ object_0.attribute == 1 # True
32
40
  ```
33
41
 
42
+ 変数に代入してもオブジェクトは変化しませんが、
43
+ 属性に代入するとオブジェクトは変化するというのがポイントです。
44
+ * [Python の代入ってなに?](https://python.ms/object/identity/assignment/)
45
+
34
46
  #### ◯
35
47
 
36
48
  状態を持たせるために関数の引数の初期値に値を持たせるとか