オブジェクト指向の勉強の続きです。
データメンバーの初期化
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 = '天衣無縫'
このように値を1つ1つ入れるのではなく。以下のように入れたい。
christefan = Player("クリステファン・ローディ", "FW", 409, 193, 395, '天衣無縫')
__init__
メソッド
__init__
は、「インスタンスが作成されるタイミングで呼びだされる特殊なメソッド」である。
Pythonは__(アンダースコア2つ)から始まる変数や関数は、そのクラス内でしか参照できなくなる。初期化する時はほかのクラスからの影響を受けては困るため、そのような配慮がされている。
__init__
メソッドを定義し、試しに__init__
内にprint文を加えてインスタンスを作成し、コンストラクタの挙動を見ると。
class Player:
# name = ''
# position = ''
# attack = 0
# defense = 0
# technique = 0
# skill = ''
def __init__(self, name, position, attack, defense, technique, skill):
print('ポケサカ')
self.name = name
self.position = position
self.attack = attack
self.defense = defense
self.technique = technique
self.skill = skill
christefan = Player("クリステファン・ローディ", "FW", 409, 193, 395, '天衣無縫')
print(christefan.name, christefan.position, christefan.attack, christefan.skill)
実行すると、インスタンスを作成した際に__init__
内にあるprint文が呼び出される。以下実行結果。
ポケサカ
クリステファン・ローディ FW 409 天衣無縫
__init__
メソッドがない場合、コメントアウトされた6行で初期化される。
__init__
メソッドがある場合、__init__
メソッド内の処理が反映される。
__init__
メソッドの第1引数self
Pythonではオブジェクトが利用する関数]を定義する場合、第1引数はオブジェクト自身が自動的に代入される仕組みになっている。
第一引数selfには生成したインスタンス(上の例ではchristefan)が入り、self以外の引数にはインスタンス生成時に渡された引数が入る。
関数の追加
クラスに関数を追加するには、通常の関数定義と同じdef
キーワードを使うが、第一引数が予約されている。
class Player:
def __init__(self, name, position, attack, defense, technique, skill):
self.name = name
self.position = position
self.attack = attack
self.defense = defense
self.technique = technique
self.skill = skill
def intro(self):
ability = self.attack + self.defense + self.technique
print("名前:{},ポジション:{},総合能力値:{}".format(self.name, self.position, ability))
def power_up(self, rate_up):
"""
能力上昇率から
上昇後の総合能力値を返す関数
"""
up_ability = (self.attack + self.defense + self.technique) * (1 + rate_up)
return float(up_ability)
christefan = Player("クリステファン・ローディ", "FW", 409, 193, 395, "天衣無縫")
christefan.intro()
print(christefan.power_up(0.1))
delby = Player("デルビー・ベルコム", "OMF", 326, 259, 368, "銀河の象徴")
delby.intro()
print(delby.power_up(0.5))
実行結果
名前:クリステファン・ローディ,ポジション:FW,総合能力値:997
1096
名前:デルビー・ベルコム,ポジション:OMF,総合能力値:953
1429
メソッドの中にあるselfという引数には、メソッドを呼び出したインスタンスが入る
つまり「christefan.intro()
」とメソッドを呼び出すと、selfには「christefan」が入っているので、intro()
メソッドの中の「self.name
」は「christefan.name
」を意味することになる。