下記のコードで__float__(self)
は、objectの__float__(self)
とclass floatの__float__(self)
の両方が、built in methodsとして、Pythonインタプリタ内に存在していると理解しています。
float()の挙動をオーバーライドして、変更しようとしています。
なぜ、2)で失敗するのでしょうか? objectクラスに対しては、super()は利用できないのでしょうか?
エラー文言:
AttributeError: 'super' object has no attribute '__float__'
Python data modelの公式ドキュメントには、float()は、object.__float__(self)
とclass float([x])
について下記のように記述されています。
object.float(self)¶
組み込み関数の complex(), int(), float() の実装から呼び出されます。 適切な型の値を返さなければなりません。(URL)
ーーーー
class float([x])
数または文字列 x から生成された浮動小数点数を返します。引数が文字列の場合、10進数を含んだ文字列にしてください。先頭に符号が付いていたり、空白中に埋め込まれていてもかまいません。符号として '+' か '-' を追加できます。'+' は、作られる値に何の影響も与えません。引数は NaN (not-a-number) や正負の無限大を表す文字列でもかまいません。正確には、入力は、前後の空白を取り除いた後に以下の文法に従う必要があります:
(URL)
1)object.__float__(self)
をオーバーライドした場合
python
1In [27]: class Test2: 2 ...: def __init__(self, value): 3 ...: self.value = value 4 ...: def __float__(self): 5 ...: return self.value*2 6 ...: 7 8In [28]: t2 = Test2(5) 9 10In [29]: float(t2) 11--------------------------------------------------------------------------- 12TypeError Traceback (most recent call last) 13<ipython-input-29-b015164a8653> in <module> 14----> 1 float(t2) 15 16TypeError: Test2.__float__ returned non-float (type int) 17 18In [30]: t2 = Test2(5.0) 19 20In [31]: float(t2) 21Out[31]: 10.0
2)float.__float__(self)
をオーバーライドしたい場合は、floatクラスを継承する必要があるので下記だと失敗する。
python
1In [46]: class Test2: 2 ...: def __init__(self, value): 3 ...: self.value = value 4 ...: def __float__(self): 5 ...: return super().__float__()*2 6 ...: 7 8In [47]: t2 = Test2(5) 9 10In [48]: float(t2) 11--------------------------------------------------------------------------- 12AttributeError Traceback (most recent call last) 13<ipython-input-48-b015164a8653> in <module> 14----> 1 float(t2) 15 16<ipython-input-46-f703ef12ce50> in __float__(self) 17 3 self.value = value 18 4 def __float__(self): 19----> 5 return super().__float__()*2 20 6 21 22AttributeError: 'super' object has no attribute '__float__' 23
3)float.__float__(self)
をオーバーライドしたい場合は、floatクラスを継承する必要がある
python
1 2In [43]: class Test2(float): 3 ...: def __init__(self, value): 4 ...: self.value = value 5 ...: def __float__(self): 6 ...: return super().__float__()*2 7 ...: 8 9In [44]: t2 = Test2(5) 10 11In [45]: float(t2) 12Out[45]: 10.0 13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。