【python】classmethod, staticmethodの使い方

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はクラス内の変数に依存しないということがすぐにわかります

あとなんといっても,ちょっとおしゃれですよね

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次