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

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

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

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

Python

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

Q&A

2回答

2561閲覧

pythonの継承について

foo45

総合スコア106

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2015/10/18 00:26

pythonのクラスについて勉強しているのですが、ちょっと分からないところがあります。
継承なのですが、

python

1# -*- coding: utf-8 -*- 2 3class Foo: 4 def __init__(self, x, y): 5 self.a = x 6 self.b = y 7 def get_a(self): return self.a 8 def get_b(self): return self.b 9 10class Bar(Foo): 11 def __init__(self, x, y, z): 12 super().__init__(x, y) 13 self.c = z 14 15 def get_c(self): return self.c

このような単純な継承ならなんとなく分かるのですが、例えばclass Barのスーパークラスにlistやdictなどを継承しているコードを見かけることが多々あります。
参考書にも解説がのっていないし、ネットで調べてもよく分かりませんでした。
どんな時にlistやdictを継承するのですか?またメリットは何でしょうか。

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

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

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

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

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

guest

回答2

0

普通のlistやdictよりちょっと便利だったり動作を変えたいものを作りたいときに使います。

例えば、collectionsライブラリにはOrderedDictやdefaultdictのような、ほとんどdictと同じ動作をするけど、一部だけちょっと違う動作するdictのサブクラスが用意されています。これらを一から作るのは面倒ですので、dictを継承し、動作が異なる部分だけ上書きや追加をしています。つまり、実装面で書くコードが少なくなると言うメリットがあります。また、このクラスを利用する側から見ると一部の動作をのぞいてdictと同じ動作なのでdictの場合とほぼ同じ扱いができるという利点があります。さらに、isinstance()でdictかどうか判断するとTrueが返るので、「あ、これはdictと同じメソッドを持っている」というのが動的に判るようになり、引数の型によって動作を変えるなどの条件分岐などにも使えます。

蛇足ですが、同じようなことを実現する方法で委譲という手段もあります。継承と委譲のどちらを選択するかは一長一短があるため、常に一方が必ずいいというわけではありません。

投稿2015/10/18 02:15

raccy

総合スコア21735

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

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

退会済みユーザー

退会済みユーザー

2015/10/25 15:22 編集

> isinstance()でdictかどうか判断すると ちょっと気になったので補足します。 よりパイソニックなコードでは、isinstance()を使わずに いきなりメソッドを呼び出して、存在しない例外が出れば dictとして扱わないというのが良いではないでしょうか。 ダックタイピングでは別にdictを継承する必要もなく、 アヒルのように見えてアヒルのように鳴けばアヒルとして扱って よいでしょう。
raccy

2015/10/25 22:25

ダッグタイピングにおいても型判定は必要になる場合があります。例えば、関数やメソッドでC++等言うオーバーロードを実現したいときは、isinstance()やsingledispatch(Python3.4から)を使って型を判定して動作を変えるようにします。また、今のPythonは引数の型チェックはしていませんが、将来はアノテーション(今のところただのコメントにすぎない)を使った型チェックする(いわゆる静的型付けになる)ことを考えています。これは、Pythonだけではなく、Ruby(たぶん、3.0になる頃)でもこのような静的型付けの機能を取り入れることを視野に入れています。 参考: http://methane.hatenablog.jp/entry/2013/07/14/Ducktyping_%E3%81%98%E3%82%83%E3%81%AA%E3%81%84_interface_%E3%81%AE%E8%89%AF%E3%81%95%E3%82%82%E5%8F%96%E3%82%8A%E8%BE%BC%E3%82%80_Python_(RE%3A_PHP_%E3%81%AE_interface_%E3%81%AA%E3%82%81%E3%82%93 http://www.infoq.com/jp/news/2014/09/python-type-annotation-proposal http://hrnabi.com/2015/05/12/7035/ ダックタイピングの良さはPythonやRubyによって示されましたが、同時に、問題点も見えてきています。「ガー」と鳴くからアヒルだと思ったら、おもちゃのアヒルで空を飛ばなかった・・・では、空に飛ばそうとするまで問題に気付かない可能性があるのです。もし、空に飛ばすのがきわめて特殊な条件での処理だと、テストで見逃し、バグの温床になる可能性があります。それなら、はじめからアヒルかどうか判断した方がいいときもあるのです。今のダックタイピングの良さを崩さずに如何に静的型付けのような堅牢性を持たせ、大規模開発でも問題なく使えるようにするかにテーマが移ってきています。
退会済みユーザー

退会済みユーザー

2015/10/26 04:12

そうでしたか。参考になります。 昔見た記述では、どうせ単体テストで全パス通すのだから静的型付けに品質向上効果はないと書かれていて、私も同意だったのですが、時代の流れでしょうかね。 全てのテストを自動化できるわけもなく、仕方ないですね。 (とはいえ、静的型付けイコール堅牢で大規模...というのは、本当かなあと思うところです。単体テストを通していないコードだと、動かないものは動かないですから) まあ、言語として強制でなく、オプションなら問題はないのでしょう。
guest

0

例えばアトリビュートの形でkeyを指定できるAttrDictというのがあります。以下は一番シンプルな実装です。data['event']がdata.eventでアクセスできます。

>>> class AttrDict(dict): ... __getattr__ = dict.__getitem__ ... __setattr__ = dict.__setitem__ ... >>> d = AttrDict() >>> d {} >>> d.hoge = 0 >>> d.fuga = 1 >>> d {'hoge': 0, 'fuga': 1} >>> d['fuga'] 1 >>> d['ほげ'] =1 >>> d {'ほげ': 1, 'hoge': 0, 'fuga': 1} >>> isinstance(d, dict) True

jsonなどをPythonのdictに変換したものはアトリビュートのようにアクセスできると楽・・・な場合があるかもしれません。

attrdict 2.0.0 : Python Package Index

投稿2015/10/18 02:34

sharow

総合スコア1149

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問