- Floatのインスタンス生成時に組み込み関数ならぬ組み込みクラスであるfloatに16を束縛して浮動小数点をつけた処理が内部で実行された結果が変数fに格納されているのでしょうか?つまり、float(16)と同じことがおきている。
explanation
1Floatでは__init__を上書きしていないので、floatの__init__が呼ばれますが、それが格納されるのは
2floatのインスタンスではなくFloatインスタンスです。
3
4fを表示すると16.0と表示されるのは、Floatがfloatの__repr__を上書きしていないからです。
5上書きすると以下のようになります。
python
1>>> class Float(float):
2... def __repr__(self):
3... return super().__repr__() + '(Float)'
4...
5>>> f = Float(16)
6>>> f
716.0(Float)
- しかし、f = float(16)としたときとは、結果がことなるようで、データの型が__main__.Floatになっています。これは、データ型がFloatクラスの16.0という値なのでしょうか?つまり、float型ではない。
そのインスタンスオブエジェクトのクラスが何なのかという意味では違います。
python
1>>> class Float(float):
2... pass
3...
4>>> f = Float(16)
5>>> g = float(16)
6>>> print(f.__class__)
7<class '__main__.Float'>
8>>> print(g.__class__)
9<class 'float'>
fがfloatのインスタンスであるかというと、インスタンスです。
python
1>>> isinstance(f, float)
2True
これは、Trueがintのインスタンスであるのと同じです。
また、16.0がobjectのインスタンスであるのと同じです。
python
1>>> isinstance(True, int)
2True
3>>> isinstance(16.0, object)
4True
3)一方で、float型にみえないのですが、int型との加算はでき、その出力結果は、float型にかわっています。
explanation
1Floatでは、__add__を上書きしていないので、floatの__add__が呼ばれます。
2floatの__add__はfloatを返すので演算結果はfloatになります。
3以下のように__add__(と__radd__)を上書きすれば演算結果はFloat型になります。
python
1>>> class Float(float):
2... def __add__(self, y):
3... return Float(super().__add__(y))
4... def __radd__(self, y):
5... return Float(super().__radd__(y))
6... def __repr__(self):
7... return super().__repr__() + '(Float)'
8...
9>>> f = Float(16)
10>>> f + 1
1117.0(Float)
12>>> 1 + f
1317.0(Float)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/25 10:24
2021/04/25 10:31