Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

Pythonを使ってOOPを学ぶ「ClassとObjectの概念」

Icon in a callout block
Python 100Days Challenge Day13

OOPについて学んでいく。OOPとはObject Oriented Programming(オブジェクト指向プログラミング)のこと。

これはプログラムを「オブジェクト」という小さなパーツに分けて考える方法。

オブジェクトにはデータ(attribute)とデータを操作するための関数(method)が含まれる。

そして、これらを作成するための設計図的なものであり、データ(attribute)とデータを操作するための関数(method)をひとまとめにしたものクラス(class)と呼ぶ。

クラスとオブジェクトの違い(&インスタンス)
  • クラス
    • データ(attribute)とデータを操作するための関数(method)をひとまとめにしたもの。例えば、「犬」というクラスを作ると、それはすべての犬が持つ共通の特徴を定義する
      • 犬(class)
        • 名前(attribute)
        • 年齢(attribute)
        • 種類(attribute)
        • 吠える(method)

  • オブジェクト
    • クラスをもとに作られた実体。例えば、「Buddy」という名前の犬は「犬」クラスのオブジェクトになる。「Buddy」が3歳であるなら、3歳という情報もオブジェクトになる。
      • 犬(class)
        • 名前(attribute) → Buddy(object)
        • 年齢(attribute) → 3歳(object)

  • インスタンス
    • オブジェクトの1つであり、オブジェクトが特定のクラスに属していることを強調するときに使う言葉。
      • 狼犬(class)
        • 名前(attribute) → Calvin(object)
        • 年齢(attribute) → 1歳(object)
        • 遠吠えをする(method)

    上記の犬クラスに加えて、狼犬というクラスを作成し、Calvinという名前の狼犬を定義してみた。

    このとき

    Buddyは犬クラスのインスタンスであり、

    Calvinは狼犬クラスのインスタンスである、と言える。

    それぞれ、犬クラス、狼犬クラスで定義されているメソッドを使用できる。

では、実際にコードを書いてみる。

OOPを使ったコーディング

コードを書く前に、コンストラクタ(constructor)・selfキーワードの概念を書いておく。

  • コンストラクタ
    • クラスから新しいオブジェクト(instance)が作られるとき、自動的に呼び出されるメソッドのこと
    • オブジェクトが作られる前に必要な初期設定を行うために使われる
    • Pythonでは__init__ キーワードで定義される

  • selfキーワード
    • オブジェクトの属性にアクセスするためのキーワード
    • Pythonのクラス定義内で使われ、インスタンス(instance)そのものを指す
    • 同じクラス内におけるメソッドを呼び出すことができる

# 犬クラス
class Dog:
    def __init__(self, name, age):
        self.name = name # selfを使って属性nameを定義
        self.age = age   # selfを使って属性ageを定義

    def bark(self):
        # selfを使って属性nameにアクセス
        print(f"{self.name}がワンワンと吠えています!")
        
    def get_age(self):
        # selfを使って属性ageにアクセス
        return self.age
        
my_dog = Dog("Buddy", 3) # 犬クラスからオブジェクトを作成
my_dog.bark() # my_dogがselfとして渡されて、barkメソッドが使える
print(my_dog.get_age()) # my_dogがselfとして渡されて、get_ageメソッドが使える

> 
Buddyがワンワンと吠えています!
3

ちなみに、OOPができた背景として、当時関数を利用したプログラミングだと、関数がどの関数に依存しているのかが分かりづらい、という問題があった。(手続型プログラミングと言うらしい)

そのため、従来の開発では大規模開発には耐えられないことがわかったこともあり、classを使って関数と関数に依存関係を示すようにした。

また、関数同士が依存するデータ群をまとめたり、の1つの型として抽象化したり、と多くの使い方が出てくるようになった。それが現代におけるOOP、オブジェクト指向プログラミング、とのことです。

Memo on programming by Tomo.

Powered by Tomo with passion.