Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python初心者向け:クラスとオブジェクトの基礎を徹底解説

今回は「クラス」について解説します。学校の授業のことではありませんよ。

プログラミングにおけるクラスには、独自の定義があります。クラスとは、開発者がオブジェクトのために作成する「設計図」のことです。オブジェクトに格納できるデータや、そのオブジェクトに対して実行できるメソッド(操作)を定義します。

Pythonはオブジェクト指向プログラミング言語です。つまり、オブジェクトとクラスを使ってデータを管理する開発スタイルを採用しています。

オブジェクト指向のアプローチは、コードの重複を減らし、可読性と保守性を高めるのに役立ちます。クラスとオブジェクトは、Java、Python、C++など、多くのプログラミング言語で採用されている概念です。

この記事では、クラスとは何か、どのように動作するのか、そしてPythonでクラスを宣言する方法を解説します。理解を深めるために、いくつかの具体例も紹介していきます。

クラスとは何か?

クラスとは、オブジェクトを定義するための設計図です。

家の設計図を思い浮かべてください。その設計図には、ドアの位置や窓の場所などが記載されています。プログラミングにおけるクラスも同じ仕組みです。クラスは、オブジェクトに格納できるデータの設計図を提供します。

クラスはclassキーワードを使って定義します。それでは、2つのメソッドを持つ「Player」というクラスを定義してみましょう。

class Player:
    """ これはプレイヤーのためのクラスです """
    name = "Luke"

    def wield_sword(self):
        print("剣を構えました。")

    def drink_health_potion(self):
        print("回復ポーションを飲みました。")

このクラスは、ビデオゲーム内のプレイヤーを表しています。属性とメソッドの両方を含んでいます。属性は、クラス内に存在する場合は「インスタンス変数」と呼ばれることもあります。

1つ目のメソッドは剣を構える動作、2つ目のメソッドは回復ポーションを飲む動作を実行します。また、このクラスには「name」というクラス変数が1つ含まれており、プレイヤーのデフォルト名を格納しています。

コードの中でselfという言葉が何度か使われていることに気づいたでしょうか。selfはその名の通り、クラス自身を表すものです。selfには特定のクラス内に格納されたすべての値が含まれているため、メソッド内からそれらすべてにアクセスできます。

ところで、このコードを実行しても何も起こりません。なぜでしょうか? クラスは「設計図」であると説明したことを覚えていますか? 何も起こらないのはそのためです。設計図を活用して実際に使えるものにするには、次に説明する「オブジェクト」を作成する必要があるのです。

オブジェクトとは何か?

オブジェクトとは、クラスの個別のインスタンスです。クラスが作成した設計図に基づいて定義されます。

それでは、ゲームに登場する新しいプレイヤー「Luke」のオブジェクトを作成してみましょう。

luke = Player()

これで「Luke」というオブジェクトが作成されました。このオブジェクトは、クラス内に格納されたすべてのデータと、クラスに関連付けられたメソッドにアクセスできます。

luke = Player()
print(luke.name)
luke.wield_sword()

実行結果:

Luke
剣を構えました。

このコードでは、Lukeオブジェクトのname属性の値を出力しました。クラスの属性にアクセスするには、オブジェクト名の後にドット(.)を付け、続けてアクセスしたいインスタンス属性を指定します。これは一般に「ドット記法」と呼ばれます。

デフォルトでは、nameの値は「Luke」に設定されています。この値を変更する方法については後ほど説明します。

また、wield_sword()メソッドも呼び出しました。このメソッドを呼び出すと、Playerクラス内のwield_sword()メソッドの内容が実行され、「剣を構えました。」というメッセージがコンソールに出力されました。

クラスからは、好きなだけオブジェクトを宣言できます。これこそがクラスの強力な点です。クラス内に格納された同じメソッドやデフォルト値を、複数の異なるオブジェクトで再利用できます。

クラスコンストラクタ

コンストラクタを使用すると、クラス内のデータを初期化できます。コンストラクタメソッドは、特定のクラスのオブジェクトを宣言した直後に自動的に実行されます。

コンストラクタの名前は__init__()です。コード内でアンダースコア2つ(__)で囲まれた関数を見たことがあるかもしれません。これらは「特殊メソッド」と呼ばれ、あらかじめ定義された目的を持っています。この場合、__init__の役割はクラスを初期化することです。

先ほど作成したPlayerクラスを更新して、クラスの先頭にこのメソッドを追加してみましょう。

def __init__(self):
    print("キャラクターが作成されました。")

このメソッドは、クラス内で変数や他のメソッドを定義する前に記述する必要があります。先ほどのメインコードをもう一度実行してみましょう。

luke = Player()
print(luke.name)
luke.wield_sword()

実行結果:

キャラクターが作成されました。
Luke
剣を構えました。

メインプログラムでは__init__メソッドを明示的に呼び出していないのに、実行されました。これは、コンストラクタがクラスのオブジェクトを作成すると自動的に実行されるためです。

先ほど、クラス内のname変数に「Luke」という値を直接代入しました。プレイヤーの名前をLukeに固定したい場合には便利ですが、プレイヤーごとに異なる名前を付けたい場合には実用的ではありません。

そこで登場するのがコンストラクタです。プレイヤーに名前を割り当てられるコンストラクタを作成してみましょう。

class Player:
    def __init__(self, name):
        self.name = name

このコードにより、各Playerオブジェクトにパラメータを渡せるようになりました。このパラメータはプレイヤーの名前を表します。次に、プレイヤーの名前を出力するメソッドを追加しましょう。

class Player:
    def __init__(self, name):
        self.name = name

    def get_name(self):
        print("あなたの名前は" + self.name + "です")

「Leah」という名前のプレイヤー用に、Playerクラスの新しいインスタンスを作成してみましょう。

leah = Player("Leah")
leah.get_name()

実行結果:

あなたの名前はLeahです

オブジェクトのname変数に「Leah」という値が代入されました。これにより、クラス内でこの変数を参照するどこでも、その値は「Leah」になります。コンストラクタはクラスのオブジェクトを作成した時点で自動的に実行されるため、呼び出しを気にする必要はありません。

その後、get_name()メソッドを呼び出すと、プレイヤーに関連付けられた名前が出力されます。

クラスには、必要なだけパラメータを追加できます。

class Player:
    def __init__(self, name, player_type):
        self.name = name
        self.player_type = player_type

    def get_name(self):
        print("あなたの名前は" + self.name + "です")

    def get_player_type(self):
        print(self.name + "は" + self.player_type + "です。")

この例では、Playerクラスが2つのパラメータをサポートしています。1つはプレイヤーの名前(name)、もう1つはそのプレイヤーのタイプ(player_type)です。このクラスのオブジェクトを作成してみましょう。

leah = Player("Leah", "魔法使い")
leah.get_name()
leah.get_player_type()

実行結果:

あなたの名前はLeahです
Leahは魔法使いです。

指定した両方の初期値が、クラス内で正しく参照できています。

まとめ

クラスを活用すると、コードの重複を大幅に減らせます。クラスを一度定義すれば、その構造を使って好きなだけオブジェクトを定義できます。重複が減ることで、コードの可読性が向上し、保守もしやすくなります。

これで、あなたもプロのようにPythonのクラスを書く準備が整いました!

  1. Pythonでクラスの属性とメソッドにアクセスする方法を徹底解説

    Pythonはオブジェクト指向プログラミング言語であり、オブジェクトを中心とした設計思想を持っています。クラスはオブジェクトを生成するための設計図(ブループリント)であり、各クラスは複数の属性を持ちます。さらに、関数も属性としてクラスに持たせることが可能です。 クラスの属性へのアクセス クラスの属性を確認したり操作したりする際には、Pythonに組み込まれている以下のメソッドが便利です。 getattr() — クラスの属性値を取得するための組み込み関数。 hasattr() — クラスやオブジェクトに指定した属性が存在するかどうかを真偽値で確認する組み込み関数。 setattr() —

  2. Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説

    Pythonでは、ファイルを読み書きする際に特別なライブラリをインポートする必要はありません。ファイル操作は言語にネイティブに組み込まれているためです。 まず最初に行うのは、組み込み関数 open() を使ってファイルオブジェクトを取得することです。open() 関数はファイルを開き、ファイルオブジェクトを返します。このファイルオブジェクトには、開いたファイルから情報を取得したり、内容を操作したりするためのメソッドや属性が含まれています。 ファイルとは何か? ファイル操作を行う前に、「ファイルとは何か」を理解しておきましょう。ファイルとは、関連する情報を保存するためにディスク上に確保された「名