質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

1回答

1084閲覧

継承したfloatクラスの出力結果の実態について

sequelanonymous

総合スコア123

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

0クリップ

投稿2021/04/25 08:58

下記のコードでそれぞれのアウトプットの意味を明確に理解したいと思っています。

  1. Floatのインスタンス生成時に組み込み関数ならぬ組み込みクラスであるfloatに16を束縛して浮動小数点をつけた処理が内部で実行された結果が変数fに格納されているのでしょうか?つまり、float(16)と同じことがおきている。

  2. しかし、f = float(16)としたときとは、結果がことなるようで、データの型が__main__.Floatになっています。これは、データ型がFloatクラスの16.0という値なのでしょうか?つまり、float型ではない。

3)一方で、float型にみえないのですが、int型との加算はでき、その出力結果は、float型にかわっています。Floatインスタンスと加算してることになりますが、演算子が実行される際に__func__()がよばれインスタンスも扱えるようになるのでしょうか?

python

1class Float(float): 2 pass 3f = Float(16) 4 5f 6-> 16.0 7 8type(f) 9-> __main__.Float 10 11f + 10 12-> 26.0 13 14f = f + 10 15type(f) 16-> float

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. 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)
  1. しかし、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:04

編集2021/04/25 10:27
ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2021/04/25 10:24

ありがとうございます! まさに下記の部分が一番困っていてこの回答をみて諸々知識がつながりすっきりしました。 > fを表示すると16.0と表示されるのは、Floatがfloatの__repr__を上書きしていないからです。 上書きすると以下のようになります。
sequelanonymous

2021/04/25 10:31

すみません、今確認したら、 >>> class Float(float): ... def __repr__(self): ... return super().__repr__() + '(Float)' ... >>> f = Float(16) >>> type(f) __main__.Float だったので、出力の型は、floatにしたい場合は、どのスペシャルメソッドをオーバーライドすればいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問