回答編集履歴
1
説明追加
test
CHANGED
@@ -39,3 +39,45 @@
|
|
39
39
|
2)ではTest2の基底クラスはobjectだけですので、super().__float__()は当然エラーになります。
|
40
40
|
|
41
41
|
```
|
42
|
+
|
43
|
+
もう少し根本的なところから説明します。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
```explain
|
48
|
+
|
49
|
+
Pythonは、処理系開発者以外の開発者が柔軟に機能を追加できるように作られています。
|
50
|
+
|
51
|
+
Python処理系の開発者は、numpyのことは全く意識せずにPythonを開発しています。
|
52
|
+
|
53
|
+
numpyで定義されているさまざまな数型をPythonで使えるようにするのは全てnumpyの
|
54
|
+
|
55
|
+
開発者の仕事なのです。
|
56
|
+
|
57
|
+
変数np16xがnumpy.float16型の42.0で、これをPythonのfloat型にしたいという場合、
|
58
|
+
|
59
|
+
float(np16x)と書きますね。
|
60
|
+
|
61
|
+
float()は組み込みクラスfloatのコンストラクタですので、float.__init__(self, np16x)
|
62
|
+
|
63
|
+
が呼びだされます。
|
64
|
+
|
65
|
+
float.__init__はPython処理系のソースコードにC言語で記述されています。
|
66
|
+
|
67
|
+
その第二引数に何が来るかはfloat.__init__にはわかりません。
|
68
|
+
|
69
|
+
float.__init__が行うことは第二引数の__float__メソッドを呼び出し、その結果が
|
70
|
+
|
71
|
+
float型であるかどうかをチェックして返すという処理です。float型でなければ
|
72
|
+
|
73
|
+
TypeError: float16.__float__ returned non-float (type ***)
|
74
|
+
|
75
|
+
つまり、float(np16x)をfloatに変換する責任はnumpy.float16.__float__にあるのです。
|
76
|
+
|
77
|
+
これがPythonの拡張性です。
|
78
|
+
|
79
|
+
このように、pythonインタプリタや組み込みクラスのメソッドあkら呼びだされるメソッド
|
80
|
+
|
81
|
+
のことを特殊メソッドと呼んでいます。
|
82
|
+
|
83
|
+
```
|