インスタンスメソッドの使い方
pythonには、インスタンスメソッド、クラスメソッド、スタティック(静的)メソッドの3つのメソッドがある。
それぞれ、以下のように定義される。
- 各メソッドの定義方法
def method(self): # インスタンスメソッド
return 'インスタンスメソッドの実行', self
@classmethod
def classmethod(cls): # クラスメソッド
return 'クラスメソッドの実行', cls
@staticmethod
def staticmethod(): # スタティックメソッド
return 'スタティックメソッドの実行'
インスタンスメソッドとは、最も基本的で、よく利用されるメソッドである。
実行するにはインスタンス化する必要があり、パラメータの第1引数のselfは実行するインスタンス自身を指す
selfは、インスタンスの持っているプロパティやメソッドにアクセスして、値を書き換えることができる。
また、self.__class__としてクラス変数にアクセスすることもできる。
- インスタンスメソッドの利用
def method(self): # 第1引数はself
print('インスタンスメソッドの実行')
MyClass.method() # クラスから直接呼び出さない
my_class = MyClass()
my_class.method() # インスタンス化してからインスタンスメソッドは呼び出す
- selfの利用1
def method(self):
print(self.val) # インスタンスのプロパティvalにアクセス
my_class = MyClass()
my_class.val = 'val' # インスタンスのプロパティvalに値を設定
my_class.method() # 「val」と表示
- selfの利用2
def __init__(self, val):
self.__val = val
def method(self):
print(self.__val) # プロパティにアクセス
self.__method_b() # インスタンスのメソッド__method_bを実行
def __method_b(self):
print('method b')
my_class = MyClass('プロパティ') # __init__で__valに「プロパティ」を設定
my_class.method()
クラスメソッド(@classmethod)の使い方
クラスメソッドは、MyClass.classmethodとしてクラスをインスタンス化せずに実行するメソッドのことを言う。
クラスメソッドは、@classmethodを付けて定義し、第1引数にclsを与える。
clsは、クラスオブジェクトを指す。
clsでは、インスタンスのプロパティを変更はしない。クラス変数など、クラスの状態を変更する。
(インスタンス変数とクラス変数について)
class Spam:
@classmethod # クラスメソッドとして定義
def clsmethod(cls): # クラスメソッドは第1引数をclsにする
- クラスメソッドの定義(@classmethod)
name = "Taro" # クラス変数
def __init__(self, age):
self.age = age # インスタンス変数
@classmethod
def print_name(cls): # クラス変数
print("名前は{}です。".format(cls.name)) # クラス変数にアクセス
print("年齢は{}です。".format(cls.age)) # クラスメソッドからはインスタンス変数にアクセスする
Human.print_name() # 「名前はTaroです。」と表示
Human.name = "Jiro" # クラス変数の変更
Human.print_name() # 「名前はJiroです。」と表示される
スタティックメソッド(@staticmethod)の使い方
pythonのスタティックメソッドは、クラスメソッドとよく似ているが、第1引数にselfやclsを指定しない。
インスタンスメソッドやクラスメソッドのように、インスタンスやクラスが渡さず、インスタンス変数、クラス変数にアクセスして変更はしない。
以下のように宣言する
class class_a:
@static_method # static_methodの定義
def method_a(arg):
pass
スタティックメソッドはインスタンスメソッドやクラスメソッドの処理の中身を分けたい場合、クラスやインスタンスの状態を変更・参照する必要がない場合に用いる。
- スタティックメソッド(@staticmethod)の例
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return self.circle_area(self.radius) # スタティックメソッドを呼び出す。
@staticmethod
def circle_area(r): # スタティックメソッド
return r ** 2 * math.pi
c1 = Circle(5)
print(c1.area())