回答編集履歴

4

足し算の型を追加

2021/04/25 10:27

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -108,4 +108,38 @@
108
108
 
109
109
  floatの__add__はfloatを返すので演算結果はfloatになります。
110
110
 
111
+ 以下のように__add__(と__radd__)を上書きすれば演算結果はFloat型になります。
112
+
111
113
  ```
114
+
115
+
116
+
117
+ ```python
118
+
119
+ >>> class Float(float):
120
+
121
+ ... def __add__(self, y):
122
+
123
+ ... return Float(super().__add__(y))
124
+
125
+ ... def __radd__(self, y):
126
+
127
+ ... return Float(super().__radd__(y))
128
+
129
+ ... def __repr__(self):
130
+
131
+ ... return super().__repr__() + '(Float)'
132
+
133
+ ...
134
+
135
+ >>> f = Float(16)
136
+
137
+ >>> f + 1
138
+
139
+ 17.0(Float)
140
+
141
+ >>> 1 + f
142
+
143
+ 17.0(Float)
144
+
145
+ ```

3

書式修正

2021/04/25 10:27

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -107,3 +107,5 @@
107
107
  Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
108
108
 
109
109
  floatの__add__はfloatを返すので演算結果はfloatになります。
110
+
111
+ ```

2

説明追加

2021/04/25 10:19

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -8,7 +8,35 @@
8
8
 
9
9
  floatのインスタンスではなくFloatインスタンスです。
10
10
 
11
+
12
+
13
+ fを表示すると16.0と表示されるのは、Floatがfloatの__repr__を上書きしていないからです。
14
+
15
+ 上書きすると以下のようになります。
16
+
11
17
  ```
18
+
19
+
20
+
21
+ ```python
22
+
23
+ >>> class Float(float):
24
+
25
+ ... def __repr__(self):
26
+
27
+ ... return super().__repr__() + '(Float)'
28
+
29
+ ...
30
+
31
+ >>> f = Float(16)
32
+
33
+ >>> f
34
+
35
+ 16.0(Float)
36
+
37
+ ```
38
+
39
+
12
40
 
13
41
  2) しかし、f = float(16)としたときとは、結果がことなるようで、データの型が__main__.Floatになっています。これは、データ型がFloatクラスの16.0という値なのでしょうか?つまり、float型ではない。
14
42
 
@@ -54,9 +82,9 @@
54
82
 
55
83
  これは、Trueがintのインスタンスであるのと同じです。
56
84
 
57
- また、16.0がobject
85
+ また、16.0がobjectのインスタンスであるのと同じです。
58
86
 
59
- ```pythonのインスタンスであるのと同じです。
87
+ ```python
60
88
 
61
89
  >>> isinstance(True, int)
62
90
 
@@ -79,5 +107,3 @@
79
107
  Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
80
108
 
81
109
  floatの__add__はfloatを返すので演算結果はfloatになります。
82
-
83
- ```

1

若干の修正

2021/04/25 10:18

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  ```explanation
6
6
 
7
- Floatでは__init__を上書きしていないので、floatの__init__が呼ばれますが、それが格納されるのはfloatのインスタンスではなくFloatインスタンスです。
7
+ Floatでは__init__を上書きしていないので、floatの__init__が呼ばれますが、それが格納されるのは
8
+
9
+ floatのインスタンスではなくFloatインスタンスです。
8
10
 
9
11
  ```
10
12
 
@@ -56,7 +58,7 @@
56
58
 
57
59
  ```pythonのインスタンスであるのと同じです。
58
60
 
59
- >>> isinstance(f, float)
61
+ >>> isinstance(True, int)
60
62
 
61
63
  True
62
64
 
@@ -74,6 +76,8 @@
74
76
 
75
77
  ```explanation
76
78
 
77
- Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。floatの__add__はfloatを返すので演算結果はfloatになります。
79
+ Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
80
+
81
+ floatの__add__はfloatを返すので演算結果はfloatになります。
78
82
 
79
83
  ```