見出し画像

Lesson7(GoogleColabではじめるPython)-クラスとオブジェクト指向-

前回のLesson6(GoogleColabではじめるPython)-文字列とファイル操作-に引き続き、今回は変数とデータ型についてのレッスンとなります。実際に手を動かしながらプログラミングを行うことが近道です!ぜひ実践しましょう!

レッスンの構成は以下のとおりです。前回の内容をもとに作成しておりますので、分からない部分に関してはこれまでのレッスンを参照してください。


Lesson1: Pythonとは?GoogleColaboratoryの使い方
Lesson2: 変数とデータ型
Lesson3: 演算子と制御構造
Lesson4: コレクション
Lesson5: 関数とモジュール
Lesson6: 文字列とファイル操作
Lesson7: クラスとオブジェクト指向(今回)


クラスとオブジェクト指向

クラスとは

Pythonにはクラスという概念があります。

クラスとは、データと処理をまとめたもので、オブジェクト指向プログラミングの基本的な要素です。

これまで扱ってきたstrやintは実はクラスの1つで、それによって作られたもの(例えば文字列"Hello")がオブジェクトという考えができます。

実は、これまでオブジェクトの種類を調べるために使用したtype関数をよく見てください。以下は文字列"Hello"を変数sに代入してtype関数を用いています。

<class 'str'>と書かれているようにstrというクラスのオブジェクトであることがわかります。

少し分かりづらいという方は、クラスは建物の設計図だと考えてもらえれば大丈夫です。それによって作成されたものが実際に建築された建物(オブジェクト)というわけです。

同様に例えばstrクラスでは文字列としての設計(文字の連結、大文字や小文字への変換など)が備わっています。strクラスによって作成された"Hello"という文字列がオブジェクトであるわけです。

オブジェクト指向プログラミングとは

オブジェクト指向プログラミングとは、プログラムをオブジェクトという単位に分割して、それぞれのオブジェクトがデータや処理(メソッド)を持ち、相互にやり取りするように設計する方法です。

Pythonはオブジェクト指向プログラミング言語の1つと言えます。

オブジェクト指向プログラミングの利点は、以下のようなものがあります。

プログラムの構造がわかりやすくなる
コードの再利用性が高まる
プログラムの拡張や修正が容易になる

Pythonでは、すべてのデータはオブジェクトであり、オブジェクトはクラスによって定義されます。

intやstr以外にも自分で新しいクラスを定義することもできます。

クラスを定義するには、以下のような構文を使います。

class クラス名:

クラス名は、慣例的に大文字で始まる名前を付けます。

また、コロン(:)の後にインデントして、クラスの定義、すなわちオブジェクトの設計図を書きます。

クラスの定義には、以下のようなものがあります。

属性:オブジェクトが持つデータ
メソッド:オブジェクトが持つ処理

属性は、変数と同じように名前と値を持ちます。

メソッドは、関数と同じように引数と処理を持ちます。ただし、メソッドの最初の引数は必ずselfという名前にします。

selfは、メソッドが属するオブジェクト自身を表す特別な引数です。


(ハンズオン1)実際に動かしてみましょう!

例えば、以下のようにDogというクラスを定義してみましょう。

このDogクラスでは、nameとageという属性とgreetというメソッドを定義しています。
ちなみに属性は英語でアトリビュート(Attribute)と言います。

name属性・・・”Taro”という文字列を値に持ちます。
age属性・・・3という数値を値に持ちます。
cryメソッド・・・self引数を受け取り、犬の名前と鳴き声を表示する処理を行います。

このようにして定義したクラスから、
実際にオブジェクトを作ることをインスタンス化と言います。また、作成されたオブジェクトを特にインスタンスと呼んでいます。


作成されたname属性やage属性、greetメソッドは変更しない限りすべてのインスタンスで使用します。

インスタンス化するには、以下のようにクラス名にカッコ()を付けて呼び出します。

実行すると以下のようにcryメソッドが呼び出されます。

作成したオブジェクトは、クラスの属性やメソッドにアクセスすることができます。

属性やメソッドにアクセスするには、オブジェクト名にドット(.)を付けて、属性名やメソッド名を指定します。

メソッドを呼び出すときは、カッコ()を付けて引数を渡します。ただし、self引数は自動的に渡されるので、省略します。

また、オブジェクトの属性は、以下のように変更したり追加したりすることができます。

↓コピー用

# Dogクラス
class Dog():
    # 属性
    name = 'Taro'
    age = 3

    # メソッド
    def cry(self):
        print("Dog name",self.name,"Bow Wow")

dog1 = Dog()    #Dogクラスをインスタンス化したオブジェクトdog1を作成する
dog1.cry()        #dog1のcryメソッドを実行する        

オブジェクトの属性の作成・変更

作成したオブジェクトは、すべて同じ属性やメソッドを持っています。
以下のように属性を変更することができます。

ここではdog1オブジェクトに対して犬の名前「Hanako」に変更し、新たな属性としてgenderを作成しました。
dog1.cry()を実行した結果とprintでdog1の属性genderを表示できます。

犬の名前(name)が変更されたことと、新たな属性genderが作成できたことがわかります。

↓コピー用

# Dogクラス
class Dog():
    # 属性
    name = 'Taro'
    age = 3

    # メソッド
    def cry(self):
        print("Dog name",self.name,"Bow Wow")

dog1 = Dog()                  #Dogクラスをインスタンス化したオブジェクトdog1を作成する
dog1.name = "Hanako"        # name属性の値を変更する

dog1.cry()                     # cry関数を呼ぶ
dog1.gender = 'female'        # genderという新しい属性を追加する
print(dog1.gender)                 # male と表示される

(ハンズオン2)実際に動かしてみましょう!

コンストラクタ

例えば、Dogクラスから作ったオブジェクトは、すべてname属性が’Taro’でage属性が3になります。
これでは、個々のオブジェクトの特徴を表現できません。変更はできますが、オブジェクトを作成する度に属性や値を変更することは手間ですよね。

そこで、Pythonでは__init__という特別なメソッドが用意されています。

__init__メソッド
オブジェクトがインスタンス化されるときに自動的に呼び出されるメソッドで、オブジェクトの初期化処理を行います。コンストラクタと呼ばれています。

__init__メソッドでは、self引数の他に任意の引数を受け取ることができます。
これらの引数は、インスタンス化するときに渡します。__init__メソッドでは、self引数に属性やメソッドを追加することで、オブジェクトに反映させます。

例えば、以下のようにDogクラスを定義してみましょう。

このクラスでは、__init__メソッドが定義されています。
__init__メソッドはself引数の他にname引数とage引数を受け取ります。そして、self引数にname属性とage属性を追加しています。これらの属性は、インスタンス化するときに渡した引数の値になります。

以下のように実行結果が表示されます。

dog1 = Dog("Taro",2)

とすることによりインスタンス化する際に「Taro」と「2」という値が引数nameとageに渡されます。

↓コピー用

# Dogクラス
class Dog():
    def __init__(self,name,age):
        self.name = name
        self.age = age


    # メソッド
    def cry(self):
        print("Dog name",self.name,"Bow Wow")

dog1 = Dog("Tom",2)    #Dogクラスをインスタンス化したオブジェクトdog1を作成する
dog1.cry()        #dog1のcryメソッドを実行する

このようにして、オブジェクトの特徴を表現することができます。

クラスの考え方は日常生活での考え方をプログラムに落とし込む際に便利なものです。

例えば、Carというクラスがあったら、エンジン、タイヤといった属性値を考えます。車は当然走りますから、runというメソッドもあります。これは全体的な設計であり、実際はメーカーや車種によって作られるものが異なっていきます。作成された車がオブジェクトという訳です。

プログラムを修正する際にどの部分を修正するのかもわかりやすくなり、結果的にプログラムの保守にも有効です。


Pythonでは、クラスやオブジェクトに関するさまざまな機能が用意されています。例えば、以下のようなものがあります。

継承:あるクラスの属性やメソッドを引き継いで、新しいクラスを定義すること。元となるクラスを親クラスと呼んでいます。
多態性(ポリモーフィズム):同じ名前のメソッドでも、オブジェクトの種類によって異なる処理を行うこと
カプセル化:オブジェクトの内部のデータや処理を隠蔽して、外部からの不正なアクセスを防ぐこと

これらの機能は、オブジェクト指向プログラミングの高度なテーマです。詳しくは、公式ドキュメントや参考書などを参照してください。

以上で、Python入門講座のLesson7 クラスとオブジェクト指向についての記事は終わりです。

これでPythonの入門講座も最終回となります。
Pythonの基本的な文法や機能について学びましたが、まだまだPythonには知らないことがたくさんあります。Pythonは非常に多様で強力なプログラミング言語です。

Pythonを使って、自分の目的や興味に合ったプログラムを作ってみましょう。Python入門講座をご覧いただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?