LoginSignup
1
2

More than 3 years have passed since last update.

【python】オブジェクト指向プログラミング基礎vol.3 ~データメンバーの初期化と関数~

Posted at

オブジェクト指向の勉強の続きです。

データメンバーの初期化

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」を意味することになる。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2