オブジェクト指向の勉強の続きです
クラス
オブジェクト指向において最も基本的な仕組みで、管理対象となる情報(変数)と振る舞い(関数)を定義したテンプレートのこと。
クラスの機能として、「カプセル化」と「インスタンス(オブジェクトの生成)」がある。
カプセル化
変数と関数をまとめた上で、外部に公開する情報を制限する機能のこと
複数の変数と関数をまとめて一つのクラスにすることで、プログラムを整理整頓することができる
例:体重と身長を渡すとBMIと適正体重を求める関数
proper = 22
def cal_bmi(weight, height):
return weight / height ** 2
def cal_proper_weight(height):
return height ** 2 * proper
properというグローバル変数が使われてしまっている。
クラスを使うと以下のようになります。
class Calculation:
proper = 22
def bmi(self, weight, height):
return weight / height ** 2
def proper_weight(self, height):
return height ** 2 * Calculation.proper
変数と関数をまとめることができる。
クラスが持つ変数をクラス変数(属性)、クラスが持つ関数をメソッドという名前で呼ぶ
上の例だとCalculationクラスはクラス変数properとbmiメソッド、proper_weightメソッドを持つクラスであるといえる。
クラスの定義
クラスをつくるイメージ
この例では、左記で表現されているものを抽象化してクラスとして定義している。共通している属性をまとめてグルーピングして、そのグルーピングに対して名称をつける。
クラスの作り方
-
class
キーワードの後ろにクラス名を記述し、右にコロン(:)をつける - 慣例として最初の文字は大文字
- 変数はインデントして宣言
class Player:
name = ''
position = ''
attack = 0
defense = 0
technique = 0
skill = ''
オブジェクトをつくる構文
-
クラス名()
でオブジェクトをつくることができる - オブジェクトを生成することを**初期化(イニシャライズ)**と言う
- クラスの情報を引き継いで生成されたオブジェクトのことをインスタンスという
christefan = Player()
christefan.name = 'クリステファン・ローディ'
christefan.position = 'FW'
christefan.attack = 409
christefan.defense = 193
christefan.technique = 395
christefan.skill = '天衣無縫'
print(christefan.name, christefan.position, christefan.attack, christefan.skill)
delby = Player()
delby.name = 'デルビー・ベルコム'
delby.position = 'OMF'
delby.attack = 326
delby.defense = 259
delby.technique = 368
delby.skill = '銀河の象徴'
実行結果
クリステファン・ローディ FW 409 天衣無縫
オブジェクトとクラス
オブジェクトはクラスをもとにつくられたものものであり、Pythonのすべての値は、オブジェクトである。クラスはオブジェクトをつくる設計図で、オブジェクトはクラスからつくる。
クラスの種類を表すために、型(type)という言葉を使う。たとえば、文字列のクラスstrはstr型に、整数のクラスintはint型になる。
クラスもまたオブジェクトであり、作成したPlayer
もまたオブジェクトである。クラスというオブジェクトの型(type)はtype(型)で、type(Player)
は、type
になる。
type
を使うと、クラスも作成できる。このクラスは、class
で作成したものと同じオブジェクトで、type
クラスのオブジェクトである。
Player = type('Player')
christefan.name = 'クリステファン・ローディ'
christefan.position = 'FW'
christefan.attack = 409
christefan.defense = 193
christefan.technique = 395
christefan.skill = '天衣無縫'
print(christefan.name, christefan.position, christefan.attack, christefan.skill)
print(type(Player))
実行結果
クリステファン・ローディ FW 409 天衣無縫
<class 'type'>
- クラス(class) : 管理対象となる情報と振る舞いを定義したテンプレートのこと
- インスタンス(instance) : クラスの情報をすべて受け継いで生成されたオブジェクトのこと