回答編集履歴
4
足し算の型を追加
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
書式修正
test
CHANGED
@@ -107,3 +107,5 @@
|
|
107
107
|
Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
|
108
108
|
|
109
109
|
floatの__add__はfloatを返すので演算結果はfloatになります。
|
110
|
+
|
111
|
+
```
|
2
説明追加
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
若干の修正
test
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
|
5
5
|
```explanation
|
6
6
|
|
7
|
-
Floatでは__init__を上書きしていないので、floatの__init__が呼ばれますが、それが格納されるのは
|
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(
|
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__が呼ばれます。
|
79
|
+
Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
|
80
|
+
|
81
|
+
floatの__add__はfloatを返すので演算結果はfloatになります。
|
78
82
|
|
79
83
|
```
|