Skip to content

6.10 メソッドのタイプ

クラス定義のなかには、一部のデータ(属性)と関数(メソッド)がクラス自体の一部になっているものと、クラスから作られたオブジェクトの一部になっているものがあります。 Pythonでは、デコレータの有無や第1引数の取り方によって、メソッドを大きく3つのタイプに分けることができます。

これまでの例で見てきた、もっとも一般的なタイプのメソッドです。 クラスから作られた個別のオブジェクト(インスタンス)に対して操作を行います。

  • 第1引数: 必ず self を指定します。
  • 特徴: メソッドが呼び出されると、Pythonは対象となるオブジェクト自身を self としてメソッドに渡します。
class A():
# インスタンスメソッド(第1引数がself)
def exclaim(self):
print("I'm an A!")
easy_a = A()
easy_a.exclaim() # オブジェクトに対して呼び出す

個別のオブジェクトではなく、クラス全体に影響を与えるメソッドです。クラスに加えた変更は、すべてのオブジェクトに影響します。

  • デコレータ: メソッド定義の直前に @classmethod を付けます。
  • 第1引数: クラス自体を受け取るため、慣例として cls を指定します(class は予約語で使えないため)。

例として、クラスからいくつのオブジェクトが作られたかを数えるクラスメソッドを定義してみましょう。

class A():
count = 0 # クラス属性(すべてのオブジェクトで共有される)
def __init__(self):
# オブジェクトが作られるたびにクラス属性をインクリメント
A.count += 1
@classmethod
def kids(cls):
# cls.count を使ってクラス属性にアクセスする
print("A has", cls.count, "little objects.")
# オブジェクトを3つ作る
easy_a = A()
breezy_a = A()
wheezy_a = A()
# クラスメソッドの呼び出し(クラス全体に対する操作)
A.kids()
# 出力: A has 3 little objects.

3. 静的(スタティック)メソッド

Section titled “3. 静的(スタティック)メソッド”

クラスにもオブジェクトにも影響を与えないメソッドです。処理の都合上、独立した関数として置いておくよりクラス定義のなかに含めたほうが都合がいいため、そこに配置されているだけです。

  • デコレータ: メソッド定義の直前に @staticmethod を付けます。
  • 第1引数: selfcls は取りません(通常の関数と同じように引数を定義できます)。
class CoyoteWeapon():
@staticmethod
def commercial():
print('This CoyoteWeapon has been brought to you by Acme')
# オブジェクトを作らなくても、クラス名から直接実行できる
CoyoteWeapon.commercial()
# 出力: This CoyoteWeapon has been brought to you by Acme