オブジェクト指向 - novel-suzukikeisuke/study GitHub Wiki

クラスとは

  • 「それが、どんなものか」を表した設計図のこと
    • 属性(プロパティ)と操作(メソッド)を定義したもの

インスタンスとは

  • 実際に作った物

クラスの定義

基本的な構文

# Humanクラスを定義
class Human:

    # コンストラクタを定義
    def __init__(self, name, year):

        # メンバ
        self.name = name
        self.year = year
  • コンストラクタ : 初期化用の特殊な関数(init)
    • Pythonでは、コンストラクタは、「init()」という名前で定義するのがルール
    • コンストラクタの第1引数には、「self」を指定。「self」は、コンストラクタによって生成されるオブジェクト自身を示す
  • メンバ : クラス内で使用する変数のこと
# class宣言
class Human:

    # コンストラクタ
    def __init__(self, name, year, birth):
        self.name = name
        self.year = year
        self.birth = birth

    # 自己紹介メソッド
    def introduce(self):
        text = "私の名前は、{}です。今年で{}歳になります。"
        return text.format(self.name, self.year)

    # 加齢メソッド
    def grow_old(self, after):
        self.year += after

# インスタンス作成
souma_human = Human("souma", 26, "19931013")
print (souma_human.introduce())
# 加齢メソッド呼び出し
souma_human.grow_old(2)
print (souma_human.introduce())

出力結果
私の名前は、soumaです。今年で26歳になります。
私の名前は、soumaです。今年で28歳になります。

継承

  • 既存のクラスをコピーしたり直接上書きしたりすることなく、メソッドやメンバの追加や上書きが可能になる。
# Humanクラスを継承して、HumanHealthを定義
class HumanHealth(Human):
    # コンストラクタ
    def __init__(self, name, year, birth, height, weight):

        #親クラスのコンストラクタを呼び出す
        super().__init__(name, year, birth)

        self.height = height
        self.weight = weight

    # BMIメソッドを追加
    def get_bmi(self):
        return round(self.weight/(self.height**2),2)
  • インスタンス生成
souma = HumanHealth("souma", 26, "19931013", 1.7, 70)
# 子メンバ
print (souma.height)
# 子メンバ
print (souma.weight)
# 子メソッド
print (souma.get_bmi())
# 親メソッド
print (souma.introduce())

オーバーライド

  • クラスを継承する際に、親クラスのメソッドを上書きすること
# class宣言
class Human:

    # コンストラクタ
    def __init__(self, name, year, birth):
        self.name = name
        self.year = year
        self.birth = birth

    # 自己紹介メソッド
    def introduce(self):
        text = "私の名前は、{}です。今年で{}歳になります。"
    return text.format(self.name, self.year)

    # 名前取得メソッド
    def get_name(self):
        return self.name

# Humanクラスを継承して、HumanHealthを定義
class HumanHealth(Human):

    # コンストラクタ
    def __init__(self, name, year, birth, height, weight):

        #親クラスのコンストラクタを呼び出す
        super().__init__(name, year, birth)

        self.height = height
        self.weight = weight

    # BMIメソッドを追加
    def get_bmi(self):
        return round(self.weight/(self.height**2),2)

    # 自己紹介メソッドをオーバーライド
    def introduce(self):
        text = "私の名前は、{}です。今年で{}歳になります。BMIは{}です。"
        return text.format(self.name, self.year, self.get_bmi())

# 出力結果
souma = HumanHealth("souma", 26, "19931013", 1.7, 70)
# オーバーライド
print (souma.introduce())
  • オーバライドする時は親クラスとメソッド名を同じにします。さらに、メソッドの引数の数も同一にして、順番も同じにする必要があります

属性について

  • インスタンス属性 : そのインスタンスだけで使う属性
    • 関数定義文の直下でself の属性に代入
  • クラス属性 : 全てのインスタンスで共有して使う属性
    • クラス定義文の直下で変数に代入
class GirlFriend:
    # クラス変数
    #   インスタンスオブジェクト間で
    #   共有される変数
    max_intimacy = 100
    min_intimacy = 0
    
    # インスタンス変数
    #   インスタンスオブジェクト間で
    #   共有しない変数
    def __init__(self, name):
        self.name =  name
        self.intimacy = 0

    def hello(self):
        print("Hello " + self.name)

girlFriend = GirlFriend(test)
  1. クラス変数のアクセス :
  • クラス名.クラス変数(GirlFriend.max_intimacy)
  • インスタンス.クラス変数(girlFriend.max_intimacy)
  1. インスタンス変数のアクセス :
  • インスタンス名.インスタンス変数(girlFriend.hello())
    • 出力結果 : Hello test

参考URL :

参考URL(属性) :