6.10 メソッドのタイプ
クラス定義のなかには、一部のデータ(属性)と関数(メソッド)がクラス自体の一部になっているものと、クラスから作られたオブジェクトの一部になっているものがあります。 Pythonでは、デコレータの有無や第1引数の取り方によって、メソッドを大きく3つのタイプに分けることができます。
1. インスタンスメソッド
Section titled “1. インスタンスメソッド”これまでの例で見てきた、もっとも一般的なタイプのメソッドです。 クラスから作られた個別のオブジェクト(インスタンス)に対して操作を行います。
- 第1引数: 必ず
selfを指定します。 - 特徴: メソッドが呼び出されると、Pythonは対象となるオブジェクト自身を
selfとしてメソッドに渡します。
class A(): # インスタンスメソッド(第1引数がself) def exclaim(self): print("I'm an A!")
easy_a = A()easy_a.exclaim() # オブジェクトに対して呼び出す2. クラスメソッド
Section titled “2. クラスメソッド”個別のオブジェクトではなく、クラス全体に影響を与えるメソッドです。クラスに加えた変更は、すべてのオブジェクトに影響します。
- デコレータ: メソッド定義の直前に
@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引数:
selfやclsは取りません(通常の関数と同じように引数を定義できます)。
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