2016年3月28日

クラスメソッド

Python にはクラスメソッドという概念があります。
こちらでスタティックメソッドを紹介しましたが、これをもう少し進めた概念になります。


クラスメソッドは、クラス内に定義したメソッドに @classmethodデコレータを付けることで定義します。
この時、第一引数にはそのクラスの型が渡されます(慣習的に引数名は cls にする)。

# クラスメソッドを持つクラスを定義
>>> class Sample(object):
...     def __init__(self, string):
...         self.string = string
... 
...     # クラスメソッドを定義
...     @classmethod
...     def create_from_file(cls, filename):
...         return cls(open(filename).read())
... 

# クラスメソッドの呼び出し
>>> s = Sample.create_from_file('text.txt')
>>> type(s)
<class '__main__.Sample'>

クラスメソッドとスタティックメソッドはかなり似ている機能です。唯一の違いは、クラスメソッドの「第一引数は必ず型である」という点です。この違いが重要となるのは、クラスメソッドを持つクラスを継承した場合です。

# クラスメソッドを持つクラスを継承
>>> class Derived(Sample):
...     pass
... 

# 継承先でクラスメソッドの呼び出し
>>> d = Derived.create_from_file('text.txt')
>>> type(d)
<class '__main__.Derived'>
上の例では、継承先で creat_from_file() を再定義しなくても、Derivedクラスのインスタンスを取得できています。
スタティックメソッドでこのような動作をさせるためには、継承先でスタティックメソッドをオーバーライドする必要があります。

0 件のコメント:

コメントを投稿