今回は、オブジェクト指向の具体的な使い方を学ぶために少し長めのプログラムで説明していこうと思います。
オブジェクト指向では、現実空間で起こることをモチーフにしてプログラムを組んでいきます。今回のテーマは、「簡易版電話帳の作成」ということで、氏名、住所などのメンバ変数を設定し、自由自在に扱ってみましょう!
- 具体的なオブジェクト指向のコーディング例を見たい
- さらに深く理解していきたい
- 複数のクラスでのオブジェクト指向の利用例を知りたい
という方向けの内容です。
オブジェクト指向についての過去の記事もご確認ください。
【Python入門】初めてのプログラミング(オブジェクト指向)
【Python入門】初めてのプログラミング(オブジェクト指向2)
それでは頑張っていこう!
コンテンツ
無料オンライン相談を活用しよう!
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。
簡易版電話帳の作成
プログラムの考え方
簡易版電話帳の作成ということですが、今回は、氏名と住所のみのメンバ変数を扱っていきます。変数が増えても基本的にセッターメソッドやゲッターメソッドばかり増えて理解するのに煩雑になると考えたからです。
今回のクラスは、「AddressBook」と「Person」の2つです。これらのクラスと、メイン関数をすべてつなげるとコードが実行できます。「AddressBook」には、「Person」クラスのオブジェクトを格納する電話帳のイメージで考えるとわかりやすいと思います。
電話帳の機能
- 登録情報の一覧を表示
- 登録されている人の「名前」から「住所」を検索
- ある「住所」に住んでいる人をすべて抽出
実際には電話番号やメールアドレスなども必要ですが、なんせ「簡易版」なので許してください。
コードの紹介
アノテーションについて
アノテーションはよく聞く言葉ですが、別の言葉で言うと、メタ情報ですね。つまり、付加情報です。関数の横にアノテーションを付け加えることで、関数の理解を助ける効果があります。
1 2 3 |
def calc(x, y)-> 'Type : int': return x + y |
「 -> ‘アノテーション’」と記述することで、メタ情報を追加できます。
また、アノテーションの情報は自由に書くことができます。
クラス:AddressBook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class AddressBook: persons = [] def add(self, person)-> 'class Person': self.persons.append(person) def show(self): for person in self.persons: print(person.getName() + "の住所は" + person.getAdress() + "です。") def search_adress(self, name)-> 'name -> adress': for person in self.persons: if person.getName() == name: return person.getAdress() def search_person(self, adress)-> 'adress -> name': return [person.getName() for person in self.persons if person.getAdress() == adress] |
2行目の「persons」に格納するデータは、「Person」クラスのオブジェクトです。
試しに、この配列を見てみましょう。(すべてのコードを記述した場合)
1 2 3 |
print(AddressBook.persons) #[<__main__.Person object at 0x7f4655e60c90>, <__main__.Person object at 0x7f4655e60a90>, <__main__.Person object at 0x7f465b9be110>, <__main__.Person object at 0x7f465b9be8d0>, <__main__.Person object at 0x7f465b9be710>, <__main__.Person object at 0x7f465b9b6910>, <__main__.Person object at 0x7f465b9b6b10>, <__main__.Person object at 0x7f465c0eb490>, <__main__.Person object at 0x7f465c0eb050>, <__main__.Person object at 0x7f465b9be690>] |
これらのオブジェクトには、名前と住所がメンバ変数として格納されています。16進数(0x)で表されている暗号みたいなのは、保存されているメモリのアドレスです。気にしないでください。
関数「search_adress」と「search_person」は、検索単語を引数にして、検索結果を出力する関数になっています。これらの関数は処理内容的にはとても似ていますが、「人」、「名前」、「住所」の関係性を考慮する必要があります。
当たり前ですが、人には一意の「名前」が存在します。一方で、「住所」を指定しても一意の「人」を特定することはできません。例えば、「東京」で検索をかけた場合、「B」、「C」という複数の結果が出てきます。そのため、関数「search_adress」では、「名前」に対する検索結果を単純に返り値とします。そして、関数「search_person」では、検索結果をリストとして返します。
包括表記に関する記述法は過去の記事を参考にしてください。
クラス:Person
1 2 3 4 5 6 7 8 9 10 11 |
class Person: def __init__(self, name, adress): self.name = name self.adress = adress def getName(self): return self.name def getAdress(self): return self.adress |
このクラスでは、基本的なコンストラクタや、ゲッターメソッドなので特に説明はないです。
メイン関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import random if __name__ == "__main__": addressBook = AddressBook() persons = [chr(i + 65) for i in range(10)] adress = ["東京", "愛知", "大阪"] for person in persons: i = random.randint(0, len(adress) - 1) p = Person(person, adress[i]) addressBook.add(p) addressBook.show() print(addressBook.search_adress("A")) print(addressBook.search_person("大阪")) |
3行目:AddressBookクラスのインスタンス生成
5行目:変数「persons」には、名前を設定しています。(A ~ Jさん)
10行目:「Person」クラスのインスタンス生成。メンバ変数:(name, adress)
11行目:3行目で生成したaddressBookに、オブジェクト「p」を登録
13 ~ 15行目は、AddressBookクラスのメソッドを順番に呼び出していきます。
13行目:登録されたデータの一覧表示
14行目:「A」さんの住所検索
15行目:住所が「大阪」である人を抽出
全体のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
class AddressBook: persons = [] def add(self, person)-> 'class Person': self.persons.append(person) def show(self): for person in self.persons: print(person.getName() + "の住所は" + person.getAdress() + "です。") def search_adress(self, name)-> 'name -> adress': for person in self.persons: if person.getName() == name: return person.getAdress() def search_person(self, adress)-> 'adress -> name': return [person.getName() for person in self.persons if person.getAdress() == adress] class Person: def __init__(self, name, adress): self.name = name self.adress = adress def getName(self): return self.name def getAdress(self): return self.adress import random if __name__ == "__main__": addressBook = AddressBook() persons = [chr(i + 65) for i in range(10)] adress = ["東京", "愛知", "大阪"] for person in persons: i = random.randint(0, len(adress) - 1) p = Person(person, adress[i]) addressBook.add(p) addressBook.show() print(addressBook.search_adress("A")) print(addressBook.search_person("大阪")) |
出力結果
ランダム関数を用いているので、毎回異なる出力になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Aさんの住所は東京です。 Bさんの住所は大阪です。 Cさんの住所は東京です。 Dさんの住所は愛知です。 Eさんの住所は愛知です。 Fさんの住所は大阪です。 Gさんの住所は大阪です。 Hさんの住所は愛知です。 Iさんの住所は東京です。 Jさんの住所は愛知です。 東京 ['B', 'F', 'G'] |
ちゃんと想定している結果が出ていますね!
まとめ
今回はオブジェクト指向の使い方として、簡易版電話帳の作成を行ってみました。コード例を見て難しいと感じた方が多いのではないでしょうか。がっつりオブジェクト指向型プログラミングでした。フロー型プログラミングとは違い、全体の処理の流れがつかめないと感じるかもしれませんが、大型のプログラムになると逆に扱いが難しくなってきます。
オブジェクトの考え方や扱い方は今回の記述例で少しずつ慣れてきていると思います。
また別の記事で現実世界の処理をオブジェクト指向で考えてみる予定です。
最後まで記事を読んでいただきありがとうございます!
無料の説明会を有効活用しよう!
独学での学習は孤独感を感じやすく挫折してしまう初心者も多いです。また、参考書を購入しても全く読む気にならないという方も多いはずです。
それでも、なんとかPythonの勉強を行い、高スキルなエンジニアを目指したいという方は無料で受けられるオンライン説明会に参加してみることも一つの手です。
Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。
その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。