ばぁど・うぉっちんぐ

セキュリティに強いWeb屋。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

【7日目】Python勉強メモ -オブジェクトとクラス-

本日はクラスについてです。

オブジェクト指向は深くまで触りません。

前回はこちら ultrabirdtech.hatenablog.com

オブジェクトとは

Pythonは全てがオブジェクトである。

数値で定義した7や、文字列として定義したstringなどもオブジェクトになる。

オブジェクトにはデータ(変数や属性)とコード(関数、メソッド)が含まれている。

オブジェクトは具体的なものの一意なインスタンス(実態、実例)を表現している。

例えば、int型やfloat型などは抽象化されたクラスである。

この抽象化されたクラスを元に、より具体化されたインスタンスである78が生成される。

78は整数オブジェクトを元に生成されているため、整数オブジェクトが持つ変数やメソッドを使うことができる。

クラスとは

クラスとはインスタンスを生成元の型である。

定義方法

classキーワードを用いる。class予約語である、このキーワードを用いることでクラスを定義することができる。

class Person():
      pass

someone = Person()

初期化メソッド

__init__は初期化メソッド。 Person()インスタンスが生成された時に呼び出されるメソッドである。 インスタンス生成時に必要な処理などはこの__init__に記述する。

class Person():
    def __init__(self):
        print('initialize!!!')

========実行結果===========
>>> someone = Person()
initialize!!!

内部のデータへアクセスする

生成インスタンスの内部データにアクセスするには生成したインスタンス.データ名でアクセスすることが可能。 メソッドも同様に生成したインスタンス.メソッド名()で使用可能。

クラス内部で自身に設定された要素を操作する場合はselfを使用する。

class Person():
   def __init__(self, name):
       self.name = name

   def introduction(self):
       print("My name is '" + self.name + "'") # クラス内部で触る場合はselfが必要


========実行結果===========
>>> someone = Person('steeve')
>>> someone.name  # 内部のデータの参照
steeve

>>> someone.introduction()  # 内部のメソッドの実行
My name is 'steeve'

クラスの継承

クラスには継承という概念がある。

これは親クラス、子クラスを定義し継承を行うことで子クラスから親クラスの変数やメソッドを利用することができるという仕組みだ。

なぜ、このような仕組みが必要かというとプログラミングを実物のものとして捉えて実装していると似たようなロジックが必要なクラスを書かなければいけない場合がある。

例えば、会員登録式のWebサイト。

会員登録式のWebサイトであれば有料メンバーと無料メンバーがいるはず。 課金状況でシステムの利用範囲は異なるはず。

そういった場合は、memberクラスというものを定義し、それを派生させ有料メンバークラスと無料メンバークラスを作成する。このような継承を用いることで、記述するソースコードの量を少なくし、保守性を上げることができる。

この継承を行う際に必要なことは、親クラス、子クラスの関係がis-a関係であるということである。

# 会員クラス
class Member():
    def __init__(self, name, status):
       self.name = name
       self.status = status

    def introduction(self):
       print('[Name]:' + self.name)
       print('[Status]:' + self.status)

# 有料会員クラス
class PaidMember(Member):
    def __init__(self, name):
        self.status = 'Paid'  # status を 'Paid' と設定している
        super().__init__(name, self.status)

# 無料会員クラス
class FreeMember(Member):
    def __init__(self, name):
        self.status = 'Free'  # status を 'Free' と設定している
        super().__init__(name, self.status)

================================
>>> yamada = PaidMember('Yamada')
>>> yamada.introduction()
[Name]:Yamada
[Status]:Paid

>>> suzuki = FreeMember('Suzuki')
>>> suzuki.introduction()
[Name]:Suzuki
[Status]:Free

ソースコード解説

会員クラス

上記のソースコードを解説すると、Memberクラスでは初期化メソッドと自己紹介メソッド(introduction())を持っている。 Memberクラスが持っている要素は会員メンバーの名前(name)と自分自身が有料会員(Paid)か無料会員(Free)かを表すステータス(status)だ。

__init__()の初期化メソッド内では、初期化する際に必要な情報を要素に代入している。今回の例では初期化する段階で名前(name)とステータス(status)を設定している。

introduction()では自分自身に設定されている要素を表示している。

有料会員クラスと無料会員クラス

有料会員クラス(PaidMember)と無料会員クラス(FreeMember)は会員クラス(Member)を継承して作られている。

有料会員は会員であり、無料会員も会員である。 継承の絶対条件であるis-a関係は守られていることがわかるだろう。

各会員クラス共に初期化メソッドが存在しメソッドをオーバーライドしている。 オーバーライドした初期化メソッドの中では自分自身のstatusを設定したあとsuper()を用いて親クラスのメソッドに作業を移譲している。

Let's Try

課題1. メンバークラスに必要そうなメソッドを考えて実装してみてください

課題2. 有料メンバー、無料メンバー以外のメンバーを考えて実装してみてください

課題3. クラスで表現するのに適している事例を挙げて、実際にプログラミングで表現してみてください

まとめ

オブジェクト指向難しすぎる泣

次回はこちら ultrabirdtech.hatenablog.com