序章
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.name
をname
と等しくなるように設定します。
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
クラスです。
クラスを使用すると、各オブジェクトを最初から作成しなくても、同じパターンに従って複数のオブジェクトを作成できます。
結論
このチュートリアルでは、クラスの作成、オブジェクトのインスタンス化、コンストラクターメソッドを使用した属性の初期化、および同じクラスの複数のオブジェクトの操作について説明しました。
オブジェクト指向プログラミングは、あるプログラム用に作成されたオブジェクトを別のプログラムで使用できるため、コードの再利用を可能にするため、理解するための重要な概念です。 オブジェクト指向プログラムは、複雑なプログラムを作成するのが難しく、慎重な計画が必要なため、プログラムの設計を改善します。これにより、プログラムを長期間維持する作業が少なくなります。