オブジェクトとは

ここからPythonのクラスとオブジェクトについて説明します。プログラミング学習者が挫折するポイントの一つがオブジェクトとクラスです。まずはオブジェクトとクラスとは何かについて学習しましょう。(JavaやRuby、C#といったオブジェクト指向言語を経験されている方はこのページを飛ばしても構いません。)

オブジェクトとは

「オブジェクトとは」を説明することは論争を呼ぶ話題ですが、初学者の理解を優先するため少々不正確ですが方便を交えて説明します。

オブジェクトとは、変数の一種なのですが、様々な値や処理を一纏めにしたものと考えてください。もちろんこの説明だけで理解できる方は少ないと思いますが、後で説明するクラスを実際に使ってみると理解できるようになると思います。

これまで、数値型やリストといった組み込みの変数を利用してきましたが、オブジェクトを利用することにより数値型とリストを組み合わせたような変数を定義することができます。このことにより、現実世界にある具体的なモノを一つの変数として扱うことができます。

つまり、複雑な構造をもった概念を1まとまりとして扱うことができるようになるのです。

クラスとは

そんな便利なオブジェクトですが、作るためにはクラスと呼ばれるテンプレートのようなものが必要になります。

クラスとは「どういうオブジェクトを作るのか」の定義を記述したものです。大抵のオブジェクトはクラスを元に作られます。

クラスからオブジェクトを作ることを生成と呼びます。また「インスタンスを生成」と呼称する場合もありますが同じ意味です。

クラスとオブジェクトを使ってみる

では、具体的にクラスを作成し、オブジェクトを生成してみましょう。

まず、以下のオブジェクトを使わないコードを見てみてください。user1、user2というユーザーを表すそれぞれのデータに対し、名前と年齢を出力する関数が記述されたプログラムです。


def say(name, age):
    """ 指定した内容で挨拶します。 """
    print('私の名前は%sです。%s歳です。' % (name, age,))


# user1を定義
user1_name = "suzuki"
user1_age = 26

# user2を定義
user2_name = "sato"
user2_age = 31

# user1の名前と年齢を出力
say(user1_name, user1_age)
# user2の名前と年齢を出力
say(user2_name, user2_age)

このコードをオブジェクトを使用した書き方に変えていきます。細かい文法は次ページ以降でしますので、まずは概要を理解してください。

1. クラスを定義する

上記プログラムではユーザーの情報として名前と年齢を保持していますので、まずはクラスとして表してみます。名前と年齢を持ったユーザーを表現する場合は以下のように記述します。

class User(object):
    """
    ユーザークラス
    """

    def __init__(self, name, age):
        """
        初期化
        :param name:名前
        :param age: 年齢
        """
        self.name = name
        self.age = age

2. クラスからオブジェクトを生成する

クラスを定義したら次にクラスからオブジェクトを生成します。Userオブジェクトは以下のように生成します。

user1 = User("suzuki", 26)
user2 = User("sato", 31)

名前と年齢をバラバラと定義していたのがスッキリとしました。

3. オブジェクトの情報を読み取る

次に、say関数の引数をUserオブジェクトに変えてみましょう。

def say(user):
    """ 指定した内容で挨拶します。 """
    print('私の名前は%sです。%s歳です。' % (user.name, user.age,))

また、関数の呼び出し部分は以下のように変更します。

# user1を生成
user1 = User("suzuki", 26)
# user2を生成
user2 = User("sato", 31)

今までの変更をまとめると以下のようになります。

class User(object):
    """
    ユーザークラス
    """

    def __init__(self, name, age):
        """
        初期化
        :param name:名前
        :param age: 年齢
        """
        self.name = name
        self.age = age


def say(user):
    """ 指定した内容で挨拶します。 """
    print('私の名前は%sです。%s歳です。' % (user.name, user.age,))


# user1を生成
user1 = User("suzuki", 26)
# user2を生成
user2 = User("sato", 31)

# user1の名前と年齢を出力
say(user1)
# user2の名前と年齢を出力
say(user2)

Userオブジェクトにより、Userの名前と年齢が一纏めで扱えることができました。

4. メソッドを定義する

また、オブジェクトはデータのみならず処理も一纏めに扱うことができます。例えば上のsay関数ですが、動作をするのはユーザーですのでオブジェクトにまとめたほうが自然な感じがします。

オブジェクトがもつ関数のことをメソッドと呼びます。メソッドはクラス内に関数と同じように定義しますが、最初の引数はselfを指定します。

class User(object):
    """
    ユーザークラス
    """

    def __init__(self, name, age):
        """
        初期化
        :param name:名前
        :param age: 年齢
        """
        self.name = name
        self.age = age

    def say(self):
        """ 指定した内容で挨拶します。 """
        print('私の名前は%sです。%s歳です。' % (self.name, self.age,))

selfとは生成後の自身のオブジェクトを指します。name、ageを取得する場合はself.name、self.ageのようにアクセスします。

5. メソッドを呼び出す

メソッドを呼び出す場合はオブジェクト.メソッド()で呼び出すことができます。

# user1の名前と年齢を出力
user1.say()
# user2の名前と年齢を出力
user2.say()

6. オブジェクト版のコード

最初のコードを完全に書き換えると以下のようになります。

"""
    ユーザークラス
    """

    def __init__(self, name, age):
        """
        初期化
        :param name:名前
        :param age: 年齢
        """
        self.name = name
        self.age = age

    def say(self):
        """ 指定した内容で挨拶します。 """
        print('私の名前は%sです。%s歳です。' % (self.name, self.age,))


# user1を生成
user1 = User("suzuki", 26)
# user2を生成
user2 = User("sato", 31)

# user1の名前と年齢を出力
user1.say()
# user2の名前と年齢を出力
user2.say()

ユーザーに関するデータと処理が一つの塊として扱うことができるようになりました。

補足

このページの説明では、クラスを元にオブジェクトを生成しました。ですが、上のサンプルのようにクラスから生成したもの以外に、今まで学習してきた数値型や文字列型の変数も実はオブジェクトの一種です。また、関数やクラス自体もPythonではオブジェクトとして扱われます。