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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

Q&A

解決済

2回答

849閲覧

Pythonクラスのオブジェクト、インスタンス、継承の挙動と仕様の確認したいです。

sequelanonymous

総合スコア123

Python 3.x

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

0グッド

0クリップ

投稿2021/04/23 14:54

編集2021/04/24 07:50

クラスとは、オブジェクトの型を定義する機能です。クラスをもとに生成されたオブジェクトはインスタンスと呼ばれ、同じクラスの複数のインスタンスは、同じ性質を持ちつつもそれぞれが独立した状態を保持します。Pythonのクラスには、のちほど説明するクラスの継承、メンッドのオーバーライド(上書き)などの機能が備わっており、クラスベースのオブジェクト指向プログラミングができます。

Pythonでは、組み込み型を含めたすべてのクラスの基底クラスとしてobjectクラスがあります。っまり、すべてのオブジェクトはobjectクラスのサブクラスであり、組み込み型も自分が定義したクラスもまったく同じ様にサブクラスに定義できます。

とある書籍に上記のような記述がありました。

python

1class Length(float): 2 def to_cm(self): 3 return super().__str__ + 'cm' 4 5 6pen = Length(16) 7print(pen.to_cm()) 816.0cm

上記のコードだと、floatクラスが継承されているんでしょうか?
このfloatは、スペシャルメソッドの__float__とは関係ないものでしょうか?
などとしてください。

また、super()がついてますが、floatクラス内の__str__()というスペシャルメソッドを呼び出して何をしているのでしょうか?

さらに、to_cm(self)のselfは、何をさしていますでしょうか?クラスインスタンス自身が入る、とよくいいますが、意味がわかりません。インスタンス作成される前になんでインスタンス自身がはいるんだ、ってよく思います。

もし、お気づきの点ありましたらご教示頂けませんでしょうか?

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

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

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

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

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

quickquip

2021/04/23 16:03

> スペシャルメソッドのfloat > また、super()がついてますが、floatクラス内のstr()というスペシャルメソッドを呼び出して何をしているのでしょうか? このあたり、最低限まともに読めるように書式に気を遣ってください。 地の文は このfloatは、スペシャルメソッドの__float__とは関係ないものでしょうか? ですよね? https://teratail.com/help#about-markdown Markdownの"文章中のコード"機能で この`float`は、スペシャルメソッドの`__float__`とは関係ないものでしょうか? などとしてください。
sequelanonymous

2021/04/24 07:48

すみません、おっしゃるとおりです。修正します。ご指摘助かります。ありがとうございます。
guest

回答2

0

確認したところ、コードに誤りがあるようです。

python

1class Length(float): 2 def to_cm(self): 3 return super().__str__() + 'cm'

ですね。

  • 上記のコードだと、floatクラスが継承されているんでしょうか?

はい。

  • このfloatは、スペシャルメソッドのfloatとは関係ないものでしょうか?

スペシャルメソッドのfloatというものはないと思います。
floatというクラスのインスタンスを生成するときに、文字列とかint型のインスタンスを引数に与えることを言っているのでしょうか。
floatを関数だと誤解している人は結構いますが、class float([x])を読むと、classと書いてあります。こういうものをコンストラクタと呼ぶこともあります。intとかstrとかもクラスです。

  • super()がついてますが、floatクラス内のstr()というスペシャルメソッドを呼び出して何をしているのでしょうか?

文字列に変換しています。

explanation

1__str__はそのオブジェクトの文字列表現を返すメソッドです。 2 3>>> print((0.1).__str__.__doc__) 4Return str(self). 5 6という説明のように、そのオブジェクトの文字列化です。 7 8>>> class Length(float): 9... def __str__(self): 10... return super().__str__() + 'cm' 11... 12>>> pen = Length(16) 13>>> print(pen) 1416.0cm 15 16というように、__str__を定義すると、printは印字するときに文字列に変換するので 17上記のように印字します。
  • to_cm(self)のselfは、何をさしていますでしょうか?

クラスを定義する時点ではインスタンスは存在していませんが、メソッドが呼び出される時点ではインスタンスが存在していますので、それを指しています。

以下のコードで考えてみてください。

python

1>>> def print_mimic(x): 2... print(x) 3... 4>>> x = 100 5>>> print_mimic(x) 6100

関数print_mimicを定義した時点ではxはまだ定義されていません。
しかし、print_mimicを呼び出す時に定義されていれば問題なく動作します。
to_cmというメソッドの場合も同様に問題なく動作します。

投稿2021/04/23 15:02

編集2021/04/23 15:31
ppaul

総合スコア24670

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

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

sequelanonymous

2021/04/24 08:10

ご回答ありがとうございます!すみません、いまいち全体的に理解できていないので追加でご確認させてください! >>> class Length(float): ... def __str__(self): ... return super().__str__() + 'cm' ... >>> pen = Length(16) 上記のコードでは、`Length(16)`の意味は、16というint型のオブジェクトを引数にとっているので、floatと16が束縛される、つまりflaot=16にならない理由がわからずにいます。 また、`super().__str__()`としていますが、いきなり、`__str__()`とするだけで、なぜ、唐突にstr型にできるのでしょうか?もし`__str__(16)`のような記述でできるのであればわかりやすかったのですが、実際は16はなくstr型になっているのでなにが起きているのかがきになっています。 さらに、selfをクラス内関数の引数として利用していますが、関数内では利用していないので、ここではなんの役割をはたしているのだろうか、もしくは意味なく慣例としてかかれているだけ、という理解でいいのでしょうか? 具体的な処理の流れを理解しておきたいなと思っています。
guest

0

自己解決

python

1class Length(float): 2 def to_cm(self): 3 return super().__str__() + 'cm' 4 5 6pen = Length(16) 7print(pen.to_cm()) 816.0cm

class Length(float)は、組み込みクラスのfloatを継承している。
super().__str__()は、組み込みクラスのfloat内にバインドされてる__str__()が呼ばれている。
__str__()は、str()とprint()の実行時によばれるスペシャルメソッドで、型をstr型にする。
そのため、print(pen.to_cm())を実行したときには、str型で出力される。

def to_cm(self)のselfは、インスタンス自身がはいってるのだが、インスタンスメソッドの呼び方を常に下記の書き方2で書いていたため、なにがなんだかわからないことになっていた。
引数のselfは、下記のようにインスタンスメソッドを呼ぶ場合は、常に書く必要がある。(必要ない場合もある)

python

1class C: 2 def f(self, i): 3 return 1 4

インスタンスメソッドの利用方法

python

11) 書き方1 2# インスタンス化 3x = C() 4# selfにインスタンス化されたxを束縛してる。本来の書き方はこちら。 5z = C.f(x,1) 6type(z) 7int 8 92) 書き方2 10# インスタンス化 11x = C() 12# インスタンスメソッドの呼び出し、関数実行時には、__func__(__self__, *args)というスペシャルメソッドがよばれるため、selfという名のインスタンス自身を引数に書くのを省略できる。 13y = x.f(1) 14type(y) 15int

投稿2021/04/25 10:40

sequelanonymous

総合スコア123

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

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

quickquip

2021/04/26 02:47

どちらかというと「本来の書き方」と呼ぶべきなのは書き方2の方かと。 書き方1は、内部ではこうなっているという説明にしかあらわれない、「普通は意識しない」書き方でしょう(知っておくに越したことはない、程度)。 type(x.f) を確認してみてください。methodというクラスであることが確認できると思います。x.f はmethod型のインスタンスで、それがインスタンスメソッドオブジェクトと呼ばれている型です。 __func__ も __self__ も、methodクラスの属性です。これらはスペシャルメソッドではありません。が、読み出し専用の特殊属性で実装依存の名前という理由で、前後に__が付けられているのでしょう。 ("スペシャルメソッドならば前後__の名前が付けられている"は真だが、"前後__の名前が付けられているならばそれはスペシャルメソッド"は真ではない)
sequelanonymous

2021/04/26 04:08

コメントありがとうございます!methodクラスに属する他の特殊属性も確認したいのですが、どうやってmethodクラスの中身を確認しましたでしょうか?
sequelanonymous

2021/04/26 04:50

ドキュメントには書いてますが、コードベースでちゃんと確認したいと思ってます。たとえば、dir()でどこにあるか辿れないかなと思っていたのですが、辿りつけなそうでして。
quickquip

2021/04/26 05:05 編集

それはC言語のソースを読むべきですね。
sequelanonymous

2021/04/26 05:15

やはりそうですか。ドキュメントにかかれてるとおり、標準型の階層っていう部分は、python内部のコードを読みにく、逆にそれ以外はある程度トレースできる、っていう風に捉えてますでしょうか? 標準型の階層っていう言い方も少し気になりますが。標準以外の階層ってなんだろうと。
quickquip

2021/04/26 05:43

> 標準型の階層っていう言い方も少し気になりますが。標準以外の階層ってなんだろうと。 『「標準(で提供されている)型」の階層』でしょう。 あなたがPythonで書いたクラスは明らかに標準型ではないですよね。 それとも「型の階層」のいう概念の方がまだピンとこないということでしょうか。 > たとえば、dir()でどこにあるか辿れないかなと思っていたのですが、辿りつけなそうでして。 どんな属性があるか、ぐらいはPython側から確認ができるようによくデザインされていると思ってます。 標準型は基本「Pythonを実装している言語」で書かれているのはずなので、実装が読みたかったらそちらを読むしかないでしょう。
sequelanonymous

2021/04/26 05:58

おっしゃるとおりで、型の階層がしっくりきていないです。標準で提供されている型の階層と自分でクラス定義した型の階層と、他にどんな階層があるのだろうと思っています。
quickquip

2021/04/26 06:09

「ここに書いてあるものが言語標準で提供する型ですよ。その階層はこうなっていますよ」以上の意味はないかと思います。 それ以外はもう"それ以外"でしかないかと。
sequelanonymous

2021/04/26 07:56

型の階層以外に他の階層のイメージってお持ちでしょうか? それ以外、つまり型の階層以外はあるとして、どんなものがあるのか、という。 > それとも「型の階層」のいう概念の方がまだピンとこないということでしょうか。 と仰っていたので型以外の階層についてもご存知だと思ったので確認させていただきました。
quickquip

2021/04/26 09:05

それは"AのBが分からない"と言われた時にBは既知だと思って話していたのに説明が必要だったのは**Bの方**だった という用法でした。
sequelanonymous

2021/04/26 09:57

つまり、ご存知ではなかったということですね。型以外の階層について他の人にも聞いてみます。意味がわかりましたら、追記するようにします!
quickquip

2021/04/26 10:25

どうして(あるいはどこから)「型以外の階層」という概念が出てくるんですか?
sequelanonymous

2021/04/26 11:27

すみません、タイポしました。以外が余計でした。「型の階層」のいう概念について、他の人にも聞いてみます、と言いたかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問