Python3でクラスを構築してオブジェクトを定義する方法

提供:Dev Guides
移動先:案内検索

序章

Pythonはオブジェクト指向プログラミング言語です。 オブジェクト指向プログラミング(OOP)は、明示的なシーケンス命令に焦点を当てる手続き型プログラミングとは対照的に、コードの再利用可能なパターンの作成に焦点を当てています。 特に複雑なプログラムで作業する場合、オブジェクト指向プログラミングを使用すると、コードを再利用して、より読みやすいコードを記述できるため、保守が容易になります。

オブジェクト指向プログラミングで最も重要な概念の1つは、クラスとオブジェクトの区別です。これらは次のように定義されます。

  • Class —オブジェクトのプログラマーによって作成された青写真。 これは、このクラスからインスタンス化されるオブジェクトを特徴付ける一連の属性を定義します。
  • Object —クラスのインスタンス。 これは、クラスの実現バージョンであり、クラスはプログラムに明示されています。

これらは、パターンを作成し(クラスの場合)、パターンを利用するために使用されます(オブジェクトの場合)。

このチュートリアルでは、クラスの作成、オブジェクトのインスタンス化、コンストラクターメソッドを使用した属性の初期化、および同じクラスの複数のオブジェクトの操作について説明します。

前提条件

Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)

クラス

クラスは、オブジェクトの作成に使用するために定義できる青写真またはプロトタイプのようなものです。

関数defキーワードを使用して定義するのと同様に、classキーワードを使用してクラスを定義します。

情報:このチュートリアルのサンプルコードに従うには、python3コマンドを実行して、ローカルシステムでPythonインタラクティブシェルを開きます。 次に、>>>プロンプトの後に例を追加して、例をコピー、貼り付け、または編集できます。


Sharkというクラスを定義してみましょう。このクラスには、水泳用と素晴らしいものの2つの機能が関連付けられています。

shark.py

class Shark:
    def swim(self):
        print("The shark is swimming.")

    def be_awesome(self):
        print("The shark is being awesome.")

これらの関数はクラスSharkの下でインデントされているため、メソッドと呼ばれます。 Methods は、クラス内で定義される特殊な種類の関数です。

これらの関数の引数は、このクラスに基づいて作成されたオブジェクトへの参照であるselfという単語です。 クラスのインスタンス(またはオブジェクト)を参照するには、selfが常に最初のパラメーターになりますが、それだけである必要はありません。

このクラスを定義しても、Sharkオブジェクトは作成されず、後で定義できるSharkオブジェクトのパターンのみが作成されました。 つまり、この段階で上記のプログラムを実行しても、何も返されません。

上記のSharkクラスを作成すると、オブジェクトの青写真が得られました。

オブジェクト

オブジェクトはクラスのインスタンスです。 上で定義したSharkクラスを取得し、それを使用してオブジェクトまたはそのインスタンスを作成できます。

sammyというSharkオブジェクトを作成します。

sammy = Shark()

ここでは、オブジェクトsammyを、Shark()と等しく設定することにより、クラスのインスタンスとして初期化しました。

次に、Sharkオブジェクトsammyで2つのメソッドを使用してみましょう。

sammy = Shark()
sammy.swim()
sammy.be_awesome()

Sharkオブジェクトsammyは、swim()be_awesome()の2つのメソッドを使用しています。 これらは、オブジェクトの属性を参照するために使用されるドット演算子(.)を使用して呼び出されました。 この場合、属性はメソッドであり、関数を使用して呼び出す方法と同様に、括弧を使用して呼び出されます。

キーワードselfは、Sharkクラスで定義されたメソッドのパラメーターであったため、sammyオブジェクトがメソッドに渡されます。 selfパラメーターは、メソッドがオブジェクト属性を参照する方法を確実に持つようにします。

ただし、メソッドを呼び出すと、括弧内には何も渡されず、オブジェクトsammyはドット演算子で自動的に渡されます。

プログラムのコンテキスト内にオブジェクトを追加しましょう。

shark.py

class Shark:
    def swim(self):
        print("The shark is swimming.")

    def be_awesome(self):
        print("The shark is being awesome.")


def main():
    sammy = Shark()
    sammy.swim()
    sammy.be_awesome()

if __name__ == "__main__":
    main()

プログラムを実行して、その機能を確認してみましょう。

python shark.py
OutputThe shark is swimming.
The shark is being awesome.

オブジェクトsammyは、プログラムのmain()関数の2つのメソッドを呼び出し、それらのメソッドを実行します。

コンストラクターメソッド

コンストラクターメソッドは、データを初期化するために使用されます。 クラスのオブジェクトがインスタンス化されるとすぐに実行されます。 __init__メソッドとも呼ばれ、クラスの最初の定義になり、次のようになります。

class Shark:
    def __init__(self):
        print("This is the constructor method.")

上記の__init__メソッドを上記のプログラムのSharkクラスに追加した場合、プログラムはsammyインスタンス化内で何も変更せずに次を出力します。

OutputThis is the constructor method.
The shark is swimming.
The shark is being awesome.

これは、コンストラクターメソッドが自動的に初期化されるためです。 このメソッドを使用して、クラスオブジェクトで実行する初期化を実行する必要があります。

上記のコンストラクターメソッドを使用する代わりに、オブジェクトに名前を割り当てるために使用できるname変数を使用するコンストラクターメソッドを作成しましょう。 nameをパラメーターとして渡し、self.namenameと等しくなるように設定します。

shark.py

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

次に、次のように、名前を参照するように関数内の文字列を変更できます。

shark.py

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

    def swim(self):
        # Reference the name
        print(self.name + " is swimming.")

    def be_awesome(self):
        # Reference the name
        print(self.name + " is being awesome.")

最後に、Sharkオブジェクトsammyの名前をSharkクラスのパラメーターとして渡すことにより、"Sammy"と等しくなるように設定できます。

shark.py

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

    def swim(self):
        print(self.name + " is swimming.")

    def be_awesome(self):
        print(self.name + " is being awesome.")


def main():
    # Set name of Shark object
    sammy = Shark("Sammy")
    sammy.swim()
    sammy.be_awesome()

if __name__ == "__main__":
    main()

これでプログラムを実行できます。

python shark.py
OutputSammy is swimming.
Sammy is being awesome.

オブジェクトに渡した名前が印刷されていることがわかります。 __init__メソッドをパラメーター名(selfキーワードとともに)で定義し、メソッド内で変数を定義しました。

コンストラクターメソッドは自動的に初期化されるため、明示的に呼び出す必要はありません。クラスの新しいインスタンスを作成するときに、クラス名に続く括弧内の引数を渡すだけです。

ageなどの別のパラメーターを追加する場合は、__init__メソッドにも渡すことで追加できます。

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

次に、オブジェクトsammyを作成するときに、ステートメントでサミーの年齢を渡すことができます。

sammy = Shark("Sammy", 5)

ageを利用するには、それを呼び出すクラスにメソッドも作成する必要があります。

コンストラクターメソッドを使用すると、オブジェクトの特定の属性を初期化できます。

複数のオブジェクトの操作

クラスは、同じ青写真に基づいて多くの同様のオブジェクトを作成できるので便利です。

これがどのように機能するかを理解するために、別のSharkオブジェクトをプログラムに追加してみましょう。

shark.py

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

    def swim(self):
        print(self.name + " is swimming.")

    def be_awesome(self):
        print(self.name + " is being awesome.")

def main():
    sammy = Shark("Sammy")
    sammy.be_awesome()
    stevie = Shark("Stevie")
    stevie.swim()

if __name__ == "__main__":
  main()

stevieという名前の2番目のSharkオブジェクトを作成し、それに"Stevie"という名前を渡しました。 この例では、be_awesome()メソッドをsammyで使用し、swim()メソッドをstevieで使用しました。

プログラムを実行してみましょう:

python shark.py
OutputSammy is being awesome.
Stevie is swimming.

出力は、sammyオブジェクトとstevieオブジェクトの2つの異なるオブジェクトを使用していることを示しています。どちらも、Sharkクラスです。

クラスを使用すると、各オブジェクトを最初から作成しなくても、同じパターンに従って複数のオブジェクトを作成できます。

結論

このチュートリアルでは、クラスの作成、オブジェクトのインスタンス化、コンストラクターメソッドを使用した属性の初期化、および同じクラスの複数のオブジェクトの操作について説明しました。

オブジェクト指向プログラミングは、あるプログラム用に作成されたオブジェクトを別のプログラムで使用できるため、コードの再利用を可能にするため、理解するための重要な概念です。 オブジェクト指向プログラムは、複雑なプログラムを作成するのが難しく、慎重な計画が必要なため、プログラムの設計を改善します。これにより、プログラムを長期間維持する作業が少なくなります。