2016年1月18日

selfのトリビア

クラスメソッドの self に関するちょっとしたトリビアを紹介します。

Python ではクラスメソッドの第一引数は self にします。
クラスメソッドを定義する度に当たり前のように self を書きますが、実はこの self、必須ではありません。
Python の文法的には、「クラスのインスタンスからメソッドを呼び出した時、メソッドの第一引数がインスタンス自身になる」と定められているだけで、第一引数を self とするのはあくまで慣習です。

# selfは予約語ですらない
>>> import keyword
>>> 'self' in keyword.kwlist
False

というわけで、self を別の単語に変えても問題なく動作します。
# selfの代わりにthis
>>> class Sample(object):
...     def __init__(this):
...         this.sample = 10
...     
...     def func(this):
...         print(this.sample)
... 

# 問題なく動作する
>>> sample = Sample()
>>> sample.func()
10

また、第一引数を self ではなく通常の引数として使うことも可能です。この場合、クラスの外から クラス名.メソッド名 と呼ぶことで、c++ や Java で言うところの static関数のような使い方ができます(このような使い方のための staticmethod デコレータもあります)。
# selfの無いクラスメソッド
>>> class Sample(object):
...     def func(x, y):
...         print(x + y)
...

# クラス名が名前空間のようになる
>>> Sample.func(2, 3)
5


ここまで普段はあまり意識しない self の性質について述べてきました。
しかし! クラスメソッドの第一引数を self にするというのは、Python での絶対的な慣習です。あえてこれを破る積極的な理由は見つかりません。
というわけで、本項で紹介したテクニックは、実際には使わない方が賢明です。

0 件のコメント:

コメントを投稿