2016/04/11更新

[Python] クラスに入門(宣言、インスタンス変数/メソッド、クラス変数/メソッド、スタティックメソッド、継承)

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
本日は、Pythonのクラスの利用方法について色々とブログに書きたいと思います。

画像

目次




クラスの基礎

Pythonは他の多くの言語と同じく、クラスを定義して使うことができます。具体的には以下のように定義します。
# クラスの定義
class MyClass(object):
    pass

# クラスからインスタンスを生成
me = MyClass()
print(me) # => <__main__.MyClass object at 0x100799b00>
これで何も要素を持たないクラスを定義できました。ちなみにこの「何も要素を持たない」クラスは以外と便利なのです。
# 何も要素を持たないクラス
class EmptyClass(object):
    pass

# 要素を好きなように定義できるので、複数の変数をまとめた入れ物として扱える
holder = EmptyClass()
holder.name = "Yohei"
holder.age = 30
print(holder.name, holder.age) # => Yohei 30
ただ、普通はクラスを何か決まった用途に使うので、後述の方法で利用します。



インスタンス変数とインスタンスメソッド

Pythonでは、インスタンス変数とインスタンスメソッドを以下のように定義します。
class MyClass(object):
    # クラス直下に定義した変数はクラス変数
    # インスタンス変数ではなく、Javaをやっていた身としては混乱しやすい
    # some_field = "aaa"

    # インスタンス生成時に、値を渡すことができる
    def __init__(self, name, age):
        # 「self.xxx」でインスタンス変数の参照/代入ができる
        self.name = name
        self.age = age

    # インスタンスメソッドの定義
    def introduce(self):
        print("My name is %s, %d years old." % (self.name, self.age))

# インスタンス化
me = MyClass('Yohei', 30)
me.introduce() # => My name is Yohei, 30 years old.

# 直接値を代入することもできる
me.name = "Taro"
me.age = 25
me.introduce() # => My name is Taro, 25 years old.
と、こんな感じでインスタンス変数とインスタンスメソッドを定義することができます。インスタンス変数は通常、インスタンス毎に異なる値を持たせたい場合に利用します。例えば、データベースの検索結果を1行ずつインスタンスとして保持したい場合などです。



クラス変数とクラスメソッドとスタティックメソッド

Pythonではクラス変数とクラスメソッドも利用でき、以下のように定義を行います。
class MyClass(object):
    # クラス直下に定義すると、クラス変数になる
    primary_key = "id"

    # クラスメソッドは「@classmethod」を付与して定義する
    @classmethod
    def show_primary_key(cls):
        print("PrimayKey is %s" % cls.primary_key)

# クラス変数やクラスメソッドへのアクセスは、インスタンス化する必要ない
print(MyClass.primary_key) # => id
MyClass.show_primary_key() # => PrimayKey is id
また、クラスメソッドに似たものとしてスタティックメソッドがあります。これは引数にcls(自分のクラスを指す変数)を受け取りません。
class MyClass(object):
    primary_key = "id"

    @classmethod
    def show1(cls):
        print(cls.primary_key)

    # スタティックメソッドは「@staticmethod」を付与して関数を定義します
    @staticmethod
    def show2():
        print(MyClass.primary_key)

MyClass.show1() # => id
MyClass.show2() # => id
クラスメソッドとスタティックメソッドでは、継承した場合に挙動が変わります。
class MySubClass(MyClass):
    primary_key = "subid"

MySubClass.show1() # => subid
MySubClass.show2() # => id
show1メソッドは引数にclsを受け取ることでMySubClass.primary_keyを取得しています。一方、show2メソッドは関数定義内部で明示的にMyClass.primary_keyを指定しているので、継承先のMySubClassから呼び出してもMyClass.primary_keyの値を参照します。継承を行う場合に振る舞いをどうしたいのかによって、クラスメソッドとスタティックメソッドは使い分ける必要がありそうです(といっても、どっちを使ってもそんなに困ることはあまりないですが)。



クラスの継承

上で少しだけ出てきましたが、クラスを継承して新しいクラスを作成することができます。クラスを継承した先は、親クラスの内容を受け継いでそれらを利用することができます。
# 人を表すクラス
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def sayHi(self):
        print("Hi, my name is %s, %d years old." % (self.name, self.age))

# 仕事人を表すクラス
class Worker(Person):
    def __init__(self, name, age, skills):
        # 親クラスの関数を使う場合には、super()を使う
        super().__init__(name, age)
        self.skills = skills
    def show_skills(self):
        # 親クラスの変数も参照できる
        print("%s's skills are %s" % (self.name, self.skills))

# インスタンス化
w = Worker("Yohei", 30, ["html","js","css"])
# 親クラスのメソッドも呼び出せる
w.sayHi()
w.show_skills()
親クラスの変数や関数を継承することができ、またsuper()(Python2系の場合はsuper(self.__class__, self))で親クラスにもアクセスすることができます。



最後に

今日はPythonのクラスを利用する方法をブログに書きました。インスタンス変数、インスタンスメソッド、クラス変数、クラスメソッド、スタティックメソッド、継承と、色々と使い分けられると便利ですね!

最後になりますが本ブログでは、フロントエンド・Python・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。