オブジェクト指向のクラスをシンプルに理解する

オブジェクト指向のクラスをシンプルに理解する

当ページのリンクには広告が含まれています。



プログラミングを学習すると、高い確率で「オブジェクト指向」という言葉に誰しもが悩まされると思います。

本記事では、とてもシンプルにオブジェクト指向のClassの使い方をまとめます。

実際にご自身のプログラミング環境で手を動かしながら勉強してみてください。

✓目次

この記事の対象者



  • プログラミングを勉強し始めたがオブジェクト指向、クラス、インスタンスというのが良くわからない人

  • 回りくどい説明が嫌な人

  • シンプルなコードで、ざっくりと理解したい人

プログラミングの環境を用意しよう。

Jupyter Notebookという環境で説明します。

以下、この記事を読まれている方の思考に応じて、2パターンのプログラミング環境の用意の仕方を紹介します。

その1:自分のPCにプログラミング環境を用意したい人

以下の記事を参考に、ご自身のPCに環境構築してみてください。

その2:環境構築とか面倒、という人

Google Colaboratoryがおすすめです。

Google Chromeとgoogleのアカウントを持っていれば、ブラウザ(Google Chrome)のみでプログラミング環境が用意できます。

【結論】クラス:設計書。インスタンス:設計書を基に作られた実態

様々な本で同じような説明がされていると思います。

ここからは実際に簡単なソースコードを活用しながらクラスとはどのようなものなのかを理解していただければと思います。

クラス(設計書)を作成する。

設計書には、最低限以下の2つを定義しなければいけません。

  • 設計書の名前

  • 設計項目

具体的な例として、人間(Person)という設計書を作っていきましょう。

今回は以下のような設計書を作ろうと思います。


  • 設計書の名前: Person
  • 設計項目
    • 名前: name
    • : nationality
    • 年齢: age


早速、Personという設計書として名前, , 年齢という3つの設計項目を用意してみます。

1
2
3
4
5
6
7
class Person: # Personという名前の設計書ですよ、と宣言

# Personの設計項目の設定
def __init__(self): # selfを忘れないように!
self.name = "" # 名前
self.nationality = "" # 国
self.age = "" # 年齢


このコードをJupyter Notebookのセルに記載して、実行してください。

SHIFTを押しながらEnterキーで実行できます。

これで、「人間」というクラス(設計書)ができました。

クラス(設計書)の項目にパラメータを設定する。

次に、この設計書の各項目に値を設定します。

設定する値は、以下のようにしたいと思います

  • 名前:鈴木

  • 国:日本

  • 年齢:10

早速、先ほどの設計書の設計項目に設定していきましょう。

1
2
3
4
5
6
7
class Person: # Personという名前の設計書ですよ、と宣言

# Personの設計項目の設定
def __init__(self): # selfを忘れないように!
self.name = "鈴木" # 名前
self.nationality = "日本" # 国
self.age = "10" # 年齢

これでOKです。

クラス(設計書)をインスタンス化(実態化)する。

ここまで作ってきた人間クラス(人間の設計書)を実体化します。

これも簡単です。


1
suzuki = Person()


これで、「suzuki」というインスタンス(実体)が作られました。

これまで作ってきたPersonという設計書からsuzukiという名前の人間を作ったのです。

もちろん、suzukiという名前のインスタンスではなく、satoという名前でインスタンス化しても問題ありません。


1
sato = Person()


ただし、Personという設計書には、”佐藤”ではなく”鈴木”という名前が設定されていました。

それにもかかわらずsatoという名前でインスタンス化してしまうと、外見は佐藤なのに、名前が鈴木という変な人間が作られてしまいます。

これを解決する方法についても後述しますので、読んでみてください。

インスタンスに名前と国と年齢を聞いてみる。

suzukiという人間と、satoという人間が作られました。

まずはsuzukiさんに名前を聞いてみましょう。以下のコードで名前を聞くことができます。


1
suzuki.name


Jupyter notebook環境だと、以下のようになります。

名前と国と年齢をまとめて聞く場合は以下のようにすればOKです。


1
2
3
print(suzuki.name)
print(suzuki.nationality)
print(suzuki.age)


すると、以下のように出力されるはずです。


コードの実行結果

satoというインスタンスにも名前を聞いてみます。

コードの実行結果

想定通り、satoさんにもかかわらず”鈴木”と返ってきました。

でもこれ不便だと思いませんか?

クラス(設計書)の各設計項目に、鈴木、日本、10(歳)、という風に設定しまうと、suzukiというインスタンスしか作れなくなってしまいます。

できるなら、satoの中には、”佐藤”という名前を設定したいし、katoの中には”加藤”という名前を設定してほしくないですか?

これを解決する手段として、クラス(設計書)の設計項目を変数にするというのがあります。

クラス(設計書)の設計項目を変数にする。

ここまで作成してきたPersonクラスの各設計項目(名前、国、年齢)には、”鈴木”、”日本”、10と設定していたいましたが、これをnamae, kuni, toshiという変数を設定します。※変数名は何でもOKです。

以下のようになります。

1
2
3
4
5
6
7
class Person: # Personという名前の設計書ですよ、と宣言

# Personの設計項目の設定
def __init__(self): # selfを忘れないように!
self.name = namae # namaeという変数を設定
self.nationality = kuni # kuniという変数を設定
self.age = toshi # toshiという変数を設定


もう少し改造が必要です。

def __init__(self):の部分に、先ほど設定した3つの変数を追記して、def __init__(self, namae, kuni, toshi):とします。


1
2
3
4
5
6
7
class Person:

# Personの設計項目の設定
def __init__(self, namae, kuni, toshi):# namae, kuni, toshiを追記
self.name = namae
self.nationality = kuni
self.age = toshi


インスタンス化してみます。

今回は、katoでインスタンス化してみたいと思います。

1
kato = Person()


すると、以下のようにエラーになると思います。※安心してください、想定通りです。


エラーの様子


なぜエラーになったのかというと、インスタンス化する際に、クラス(設計書)の設計項目に設定した変数に代入する値を設定していなかったからです。

つまり、インスタンス化する時は、クラスで規定したnamae, kuni, toshiに代入する値を()に記載しなければいけないということです。

今回は、katoというインスタンスを作成するので、各設計項目に設定する値は以下とします。

  • 名前(namae): 加藤

  • 国(kuni): 日本

  • 年齢(toshi): 30

以下のようにしてkatoというインスタンスを作成しましょう。


1
kato = Person("加藤", "日本", 30)


ついでに、mikeというインスタンスも作成します。

1
mike = Person("mike", "アメリカ", 20)



こうすることで、kato.nameと実行すれば”加藤”というのが出力されますし、mike.nameと実行すれば”mike”というのが出力されます。

【発展】インスタンスが挨拶する関数を作ってみる。

発展と言っても難しくないのでご安心ください。

作成したインスタンスに、「こんにちは井上さん。私は鈴木です。」という風な感じで、挨拶をする関数を実装してみます。

以下の通り、9行目と10行目を追記してください。


1
2
3
4
5
6
7
8
9
10
class Person:

# Personの設計項目の設定
def __init__(self, namae, kuni, toshi):# namae, kuni, toshiを追記
self.name = namae
self.nationality = kuni
self.age = toshi

def say_hello(self):
print('こんにちは井上さん。私は鈴木です。')


早速インスタンス化しましょう。

まずはsuzukiさんというインスタンスを作成します。各変数に代入する値の設定を忘れずに!


1
suzuki = Person("鈴木", "日本", 1)


早速、suzukiに挨拶をさせてみましょう。

1
suzuki.say_hello()


以下のようにちゃんと挨拶ができました。

コードの実行結果


では次にbobさんというインスタンスを作成しましょう。この際も、各変数のに代入する値の設定を忘れずに!


1
bob = Person("ボブ", "アメリカ", 70)


bobに挨拶をさせてみましょう。


1
bob.say_hello()


以下のように出力されます。



ここまで来たらある程度予測できたのではないでしょうか。

そうです、ボブなのに、「私は鈴木です。」と言ってますね。

理想としては、ボブだったら、「私はボブです。」と挨拶できるようにしたいですよね?

あと、「こんにちは井上さん。」の”井上”の部分も、設定に応じて柔軟に変化できるようにしたいです。

順序が逆になってしまいますが、まずは、「こんにちは井上さん。」の”井上”の部分を柔軟に設定できるように変数化してみたいと思います。

これを解決する方法は、以下のように、say_hello(self, namae):という風に、namaeという変数を追加し、print('こんにちは{}さん。私は鈴木です。'.format(namae))という風に変更/追記すればOKです。


1
2
3
4
5
6
7
8
9
10
class Person:

# Personの設計項目の設定
def __init__(self, namae, kuni, toshi):# namae, kuni, toshiを追記
self.name = namae
self.nationality = kuni
self.age = toshi

def say_hello(self, namae):
print('こんにちは{}さん。私は鈴木です。'.format(namae))


改めて、bobさんというインスタンスを作成し、近藤さんに挨拶をさせてみましょう。


1
2
bob = Person("ボブ", "アメリカ", 70)
bob.say_hello("近藤")

以下の通り、「こんにちは近藤さん。私は鈴木です。」という風に、井上さんが近藤さんに代わりました。


コードの実行結果


最後に、bobというインスタンスの場合は、「私はbobです。」に変換し、tomというインスタンスの場合は「私はtomです。」
という風に出力させるように改造します。

まず、”鈴木”の部分を{}に変更しします。

そして、この中括弧に当てはまる変数ですが、ここはインスタンス化する際に設定する名前なので、5行目のself.nameを指定すれば良いです。

selfは”自分自身の”と言い換えればOKです。

1
2
3
4
5
6
7
8
9
10
class Person:

# Personの設計項目の設定
def __init__(self, namae, kuni, toshi):# namae, kuni, toshiを追記
self.name = namae
self.nationality = kuni
self.age = toshi

def say_hello(self, namae):
print('こんにちは{}さん。私は{}です。'.format(namae, self.name))

上記のコードを実行したら、早速bobインスタンスとtomインスタンスを作成しましょう。

1
2
bob = Person("ボブ", "アメリカ", 70)
tom = Person("トム", "アメリカ", 120)

bobとtomに挨拶をさせてみます。

1
bob.say_hello('近藤')
1
tom.say_hello('山本')

以下の通り、ちゃんと期待通りに挨拶する相手を呼び、自分の名前を言えるようになりました。

挨拶する相手を呼び、自分の名前を言えるようになりました!

【発展】call関数の使い方

ここからはさらに発展になるので、「もう限界です。」という方は、ここまででも大丈夫です。

call関数というのは簡単に言うと、関数名を呼び出さずに処理を実行させることができる関数です。

言葉で説明するよりか、実際の動作を見たほうが分かるので、早速使い方を見ていきましょう。

以下のように、__call__という関数名で、say_hello()関数と同様の処理を定義してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person:

def __init__(self, namae, kuni, toshi):# namae, kuni, toshiを追記
self.name = namae
self.nationality = kuni
self.age = toshi

# call関数でsay_hello()を定義
def __call__(self, namae):
print('こんにちは{}さん。私は{}です。'.format(namae, self.name))

def say_hello(self, namae):
print('こんにちは{}さん。私は{}です。'.format(namae, self.name))

上記のコードを実行し、yamadaというインスタンス作成します。

1
yamada = Person("山田", "日本", 200)

そして、yamada.sayhello('大和田')というコードと、yamada.__call__('大和田')というコードを実行してみると、共に、「こんにちは大和田さん。私は山田です。」という出力が得られます。

では次に、yamada('大和田')という風に、関数名を宣言せずに実行してみてください。

すると、同様に、「こんにちは大和田さん。私は山田です。」と出力されます。

つまり、yamada.__call__('大和田')という風にわざわざ書かなくても、yamada('大和田')とするだけで、同様の処理が実行されるのです。

以下の通りです。

Call関数の使い方

便利な関数なので、積極的に使ってみましょう。

最後に

  • 本記事では、クラス、インスタンスの関係に加えて、関数の定義方法やcall関数についてもまとめました。
  • プログラミング学習については、以下の記事でおすすめの教材や勉強方法をまとめていますので、興味のある方は読んでみてください。

コメント