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

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

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

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

Python

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

Q&A

解決済

2回答

530閲覧

pythonにおけるclassの使い方について

a_boy

総合スコア54

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/09/29 04:58

python

1class StrDict(dict): 2 def __init__(self): 3 pass 4 def __setitem__(self, key, value): 5 if not isinstance(key, str): 6 raise ValueError("Key must be string.") 7 dict.__setitem__(self, key, value)

みんなのpythonから引用したコードです。このコードに限らず、一般的にクラス名の横の()の中は何を意味し、どういったときに使われるのかを教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1# coding: utf-8 2 3# 普通のディクショナリ(dict)は、keyにint型整数をセットできる 4d1 = dict() 5d1[0] = "a" 6d1[1] = "i" 7d1[2] = "u" 8d1[3] = "e" 9d1[4] = "o" 10print(d1) 11 12# ディクショナリの基本的な機能はそのままで(継承して)、 13# keyにはstr型しかセットできなくしたディクショナリにしたい(StrDictの作成) 14class StrDict(dict): 15 def __init__(self): 16 pass 17 def __setitem__(self, key, value): 18 if not isinstance(key, str): 19 raise ValueError("Key must be string.") 20 dict.__setitem__(self, key, value) 21 22d2 = StrDict() 23# d2[0] = "a" # --> ValueError: Key must be string. が発生する 24d2["0"] = "a" # strならOK 25d2["1"] = "i" 26d2["2"] = "u" 27d2["3"] = "e" 28d2["4"] = "o" 29print(d2) 30

追記

StrDictクラスはdictクラスを継承しています。このとき、dictをスーパークラス、StrDictをサブクラスと言います。

スーパークラスdictには____setitem____(self, key, value)メソッドがありますが、StrDictもdictを継承しているので、同じく____setitem____(self, key, value)メソッドを持っています。今回の例では、StrDictで同名のメソッド____setitem____(self, key, value)を定義しています。スーパークラスの持つメソッドをサブクラスで定義しなおすことを、オーバーライドと呼びます。

それでは、StrDictは____setitem____(self, key, value)をオーバーライドして何をしているのでしょうか?

Python

1 def __setitem__(self, key, value): 2 # スーパークラスの__setitem__()をオーバーライドしている 3 # 4 # d2 = StrDict() 5 # d2["0"] = "a" 6 # が実行されるとき、 7 # key="0", value="a" 8 # を引数として、このメソッドが呼ばれる。 9 if not isinstance(key, str): 10 # keyがstr型でないならば、こっち 11 raise ValueError("Key must be string.") 12 # keyがstr型ならば、こっち 13 # 今回はkey="0"なのでこっち 14 15 dict.__setitem__(self, key, value) 16 # スーパークラスdictの__setitem__(self, key, value)を呼び出す。 17 # つまり、このメソッドではkeyがstr型かどうかだけをチェックし、 18 # ディクショナリの作成処理はスーパークラスのメソッドで行っている。

投稿2018/09/29 06:30

編集2018/09/29 10:05
takey

総合スコア312

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

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

a_boy

2018/09/29 08:43

StrDictクラスの最後の一行は何を意味しているのでしょうか? わからないことが多くてすみません…
takey

2018/09/29 10:05

回答に追記しました。
a_boy

2018/10/01 02:04

非常に丁寧に教えていただきありがとうございました! おかげでしっかりと理解することができました。
guest

0

継承するクラスをそこに書きます。

python

1>>> class Hoge(dict): 2... pass 3... 4>>> h = Hoge() 5>>> h["fuga"] = "fuga" 6>>> h 7{'fuga': 'fuga'} 8

9. クラス — Python 3.6.5 ドキュメント | チュートリアル 9.5. 継承

投稿2018/09/29 05:00

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問