回答編集履歴

4

d

2020/05/12 14:46

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -68,6 +68,22 @@
68
68
 
69
69
 
70
70
 
71
+ def __imul__(self, other):
72
+
73
+ self.x *= other
74
+
75
+ return self
76
+
77
+
78
+
79
+ def __iadd__(self, other):
80
+
81
+ self.x += other
82
+
83
+ return self
84
+
85
+
86
+
71
87
  def __str__(self):
72
88
 
73
89
  return str(self.x)
@@ -82,8 +98,16 @@
82
98
 
83
99
  z = x * 2 + 2
84
100
 
85
- print(y) # 18
101
+ print(y)
86
102
 
103
+ print(z)
104
+
105
+ x += 2
106
+
107
+ print(x) # 11
108
+
109
+ x *= 2
110
+
87
- print(z) # 20
111
+ print(x) # 22
88
112
 
89
113
  ```

3

d

2020/05/12 14:46

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -31,3 +31,59 @@
31
31
  # 20
32
32
 
33
33
  ```
34
+
35
+
36
+
37
+ ## 補足
38
+
39
+
40
+
41
+ より汎用的なクラスを設計しようと思った場合、2倍にする関数だけでなく、3倍、4倍と任意の値を乗算したい場合も出てくるかもしれないので、演算子オーバロードを使うといいかもしれません。
42
+
43
+
44
+
45
+ [Python Tips:自作クラスの演算子のふるまいを定義したい - Life with Python](https://www.lifewithpython.com/2014/06/python-redefine-operators.html)
46
+
47
+
48
+
49
+ ```python
50
+
51
+ class Hoge:
52
+
53
+ def __init__(self, x):
54
+
55
+ self.x = x
56
+
57
+
58
+
59
+ def __mul__(self, other):
60
+
61
+ return Hoge(self.x * other)
62
+
63
+
64
+
65
+ def __add__(self, other):
66
+
67
+ return Hoge(self.x + other)
68
+
69
+
70
+
71
+ def __str__(self):
72
+
73
+ return str(self.x)
74
+
75
+
76
+
77
+
78
+
79
+ x = Hoge(9)
80
+
81
+ y = x * 2
82
+
83
+ z = x * 2 + 2
84
+
85
+ print(y) # 18
86
+
87
+ print(z) # 20
88
+
89
+ ```

2

d

2020/05/12 14:43

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -28,6 +28,6 @@
28
28
 
29
29
  times2_plus2(Hoge(9))
30
30
 
31
- # 9 * 2 + 2 = 18
31
+ # 20
32
32
 
33
33
  ```

1

s

2020/05/12 14:38

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,8 +1,16 @@
1
- times2_plus2() にわたす変数の型は Hoge とし、演算 Hoge オブジェクト同士で行うようにればどうでしょうか
1
+ 自身のインスタンス変数と関係ない times2_plus2() がクラス Hoge のメソッドとして定義されているの変な気がします。
2
+
3
+ フリー関数として定義してはどうでしょうか
2
4
 
3
5
 
4
6
 
5
7
  ```python
8
+
9
+ def times2_plus2(y):
10
+
11
+ return y.times2() + 2
12
+
13
+
6
14
 
7
15
  class Hoge:
8
16
 
@@ -18,15 +26,7 @@
18
26
 
19
27
 
20
28
 
21
- def times2_plus2(self, y):
22
-
23
- return y.times2() + 2
24
-
25
-
26
-
27
-
28
-
29
- Hoge(2).times2_plus2(Hoge(9))
29
+ times2_plus2(Hoge(9))
30
30
 
31
31
  # 9 * 2 + 2 = 18
32
32