Python入門から応用までの学習サイト


クラスメソッド

Pythonにおけるクラスメソッドの概要です。クラスメソッドはインスタンス化しなくても呼び出すことができますが、インスタンスからでも呼び出すことができます。

クラスメソッドの実装には「@classmethod」デコレータを用います。サンプルコードでは、年月日を保持するクラスを作成し、そこにクラスメソッドとして今日の日付を基準としたインスタンスを生成できるようにしています。なお「self」を用いたインスタンス属性(インスタンス変数)にはアクセスできません。

# -*- coding: utf-8 -*-

import datetime


class TestClass:

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    # クラスメソッド
    @classmethod
    def sample_classmethod(cls, date_diff=0):
        today = datetime.date.today()
        d = today + datetime.timedelta(days=date_diff)
        return cls(d.year, d.month, d.day)


# インスタンス化しないで呼び出し
test_class_1 = TestClass.sample_classmethod()
print test_class_1.year, test_class_1.month, test_class_1.day

# インスタンス化しないで呼び出し
test_class_2 = TestClass.sample_classmethod(-10)
print test_class_2.year, test_class_2.month, test_class_2.day

# 通常のインスタンス
test_class_3 = TestClass(2000, 1, 1)
print test_class_3.year, test_class_3.month, test_class_3.day

--実行結果--(実行した日時によって結果は変わります)

2015 11 12
2015 11 2
2000 1 1

「@classmethod」でデコレートされたメソッドはクラスメソッドとなります。インスタンスメソッドの第一引数には「self」が必要ですが、クラスメソッドには「cls」が必要です。これはクラス自身を表し、「self」が表すクラスのインスタンス自身とは異なります。また「cls」という引数名は強制ではありませんが、そうすべきであるという暗黙のルールがあります。なおサンプルコードでも利用している「datetime.date.today」もクラスメソッドです。



Python
スタートブック


入門 Python 3


Effective
Python


退屈なことは
Pythonにやらせよう

 
 
 

インスタンスにもクラスにも影響しない!?



確かな力が身につく
Python「超」入門




P  R