オブジェクト指向 - 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)
- クラス変数のアクセス :
- クラス名.クラス変数(GirlFriend.max_intimacy)
- インスタンス.クラス変数(girlFriend.max_intimacy)
- インスタンス変数のアクセス :
- インスタンス名.インスタンス変数(girlFriend.hello())
- 出力結果 : Hello test
参考URL :
参考URL(属性) :