0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Python】selfが一度も使われてないクラスならクラスメソッドやスタティックメソッドにするといいかも

Posted at

偉い人「このクラス一度もselfを使って無くない?」

class MyClass:
    def __init__(self, value):
        self.value = value

    def instance_method(self, arg):
        return self.value + arg

偉い人「じゃあわざわざインスタンスにしないでも、クラスメソッドやスタティックメソッドにするといいかも」
俺「はえー」

インスタンスとは?

インスタンスとは、クラスを基に生成された具体的なオブジェクトのこと。例えば、「車」というクラスがある場合、特定の「車の実体」(例えば「私の車」)がインスタンスとなる。

内部的には、「これ俺の車なんすよ笑」と言うと、「んじゃ場所とっときますね」とメモリを確保している。

Pythonでは、クラスを呼び出すことでインスタンスが作成される。

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model

my_car = Car("Toyota", "Corolla")  # my_carはCarクラスのインスタンス

何でもかんでも「これ俺の車なんすよ(笑)」ってやらなくても「あ、はい、車クラスですね。わかりました」というのだけで話が済むことがある。
メンテナンス性とコードの読みやすさが向上する。
具体的には、どこでインスタンス化するか気にしなくていいので、「main.pyでやってたっけ?それともその先だっけ?」みたいな焦りがなくなって結構便利。

とはいえインスタンスにしていても動きはするので、意識していないと難しかったリする。

実装の例

  • クラスメソッドにするならこう
class MyClass:
    class_variable = 0

    @classmethod
    def class_method(cls, arg):
        cls.class_variable += arg
        return cls.class_variable
  • スタティックメソッドにするならこう
class MyClass:
    @staticmethod
    def static_method(arg1, arg2):
        return arg1 + arg2

どの手段を使うべきか?

インスタンスメソッド

インスタンス変数やインスタンスの状態にアクセスする必要がある場合。

  • 例:ユーザーアカウントクラスなど
class UserAccount:
    def __init__(self, username, email):
        self.username = username
        self.email = email

    def display_user_info(self):
        return f'Username: {self.username}, Email: {self.email}'

クラスメソッド

クラス自体に関連する操作を行う場合や、クラス変数を操作する必要がある場合。

  • 例:設定管理クラスなど
class Config:
    _settings = {}

    @classmethod
    def set_setting(cls, key, value):
        cls._settings[key] = value

    @classmethod
    def get_setting(cls, key):
        return cls._settings.get(key, None)

スタティックメソッド

クラスやインスタンスの状態に依存しない汎用的な操作を行う場合。

  • 例:計算などをさせるユーティリティクラスなど
class MathUtilities:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b

この例だと単なる足し算なので嬉しさがわかりづらいが、例えば「消費税計算のためにまず軽減税率が適用される対象かどうかを判別して消費税の計算を……」みたいな「すごい面倒な計算をさせるだけ」って時に便利。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?