回答編集履歴

1

説明追加

2021/04/29 00:15

投稿

ppaul
ppaul

スコア24670

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
+ ```