Pythonをある程度使えるようになると,オブジェクト指向で書くためにClassを使って書くようになります
そこでさらにPythonライクにコードを記述するために,classmethodおよびstaticmethodを使うことがあります
この2つのmethodが一体何なのか?使わなければいけないのか?と悩んでいるのではないでしょうか
本記事では各methodの使い方,メリットについて簡単に解説します
目次
classmethod
クラス変数を操作する場合に用います
第一引数はself→clsを指定します
クラス変数を上書き
まず,下記のような給料に係数をかけるようなクラスを考えます
class Employee:
raise_amt = 1.04
def __init__(self, pay):
self.pay = pay
self.apply_raise()
def apply_raise(self):
self.pay = int(self.pay * self.raise_amt)
if __name__ == '__main__':
salary = Employee(100)
print(salary.pay)
# 104
次に,クラス変数raise_amtにアクセスします
if __name__ == '__main__':
Employee.raise_amt = 1.05
salary = Employee(100)
print(salary.pay)
# 105
最後にclassmethodでクラス変数raise_amtにアクセスします
@classmethod
def set_raise_amt(cls, amount):
cls.raise_amt = amount
if __name__ == '__main__':
Employee.set_raise_amt(1.05)
salary = Employee(100)
print(salary.pay)
# 105
1変数でクラスを取得
クラス変数を3つもつクラスに対して1つの文字列を渡してクラスを取得します
class Employee:
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
def full_name(self):
return f'{self.first} {self.last}'
@classmethod
def from_string(cls, emp: str):
first, last, pay = emp.split('-')
return cls(first, last, pay)
if __name__ == '__main__':
emp_str_1 = 'John-Doe-70000'
salary = Employee.from_string(emp_str_1)
print(salary.full_name())
staticmethod
staticmethodの用途は,クラスに依存しない関数に用います
本記事では日付を取得しています
第一引数はないので,selfはつけないようにしてください
import datetime
class Employee:
raise_amt = 1.04
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
self.apply_raise()
def full_name(self):
return f'{self.first} {self.last}'
def apply_raise(self):
self.pay = int(self.pay * self.raise_amt)
@staticmethod
def date_of_today():
dt_now = datetime.datetime.now()
return dt_now.strftime('%Y年%m月%d日')
if __name__ == '__main__':
salary = Employee('Hayate', 'Leo', 100)
print(f'{salary.date_of_today()} 氏名:{salary.full_name()} 給料:{salary.pay}円')
# 2021年08月04日 氏名:Hayate Leo 給料:104円
結論
classmethodはこのクラス変数は変更する可能性があるなとすぐにわかるようになります
staticmethodはクラス内の変数に依存しないということがすぐにわかります
あとなんといっても,ちょっとおしゃれですよね
コメント