0Pricing
Python Academy · レッスン

@classmethod と @staticmethod

適切なデコレーターでクラスメソッドと静的メソッドを定義します。

「@classmethod と @staticmethod」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

導入

@classmethodは最初の引数としてクラスを受け取ります。@staticmethodは特別な引数を受け取りません。どちらもクラス上に定義します。

インスタンス・クラス・静的メソッド

通常のメソッドはselfを受け取ります。クラスメソッドはclsを受け取ります。静的メソッドはどちらも受け取りません。必要なデータに応じて選択してください。
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

ファクトリとしての@classmethod

最も一般的な用途は、別のコンストラクターです。__init__で解析する代わりに、Date.from_string('2024-01-15')のように使えます。
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

継承と@classmethod

クラスメソッド内のclsは、基底クラスではなく実際のサブクラスを指します。そのため、ファクトリメソッドがサブクラスでも正しく動作します。
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

ユーティリティとしての@staticmethod

静的メソッドは、論理的にクラスへまとめられた通常の関数です。クラスのデータやインスタンスのデータにはアクセスできません。
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethodとモジュール関数の比較

クラスを必要としない関数は、モジュールレベルの関数にすることもできます。@staticmethodは、その関数が論理的にクラスへ属する場合にだけ使用してください。
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

インスタンスから呼び出す

インスタンスから@classmethodと@staticmethodの両方を呼び出せますが、clsや最初の引数がないという動作は変わりません。
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

シングルトンのクラスメソッド

classmethodを使うと、インスタンスがすでに存在するか確認して、シングルトンパターンを適用できます。
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

クラスメソッドのオーバーライド

サブクラスはクラスメソッドをオーバーライドできます。この場合、clsはサブクラスになり、ポリモーフィズムが維持されます。
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

clsによる型チェック

クラスメソッド内では、clsは実際のクラスを指します。インスタンスを作成するにはcls()を使い、クラス名をハードコードしないでください。
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

@propertyとの組み合わせ

クラスレベルでキャッシュする値は、@classmethodとクラス属性を組み合わせて、クラス全体で共有するキャッシュにできます。
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

クイックチェック

@classmethodにおけるclsとは何ですか?

復習

@classmethodはclsを受け取ります。ファクトリ、別のコンストラクター、シングルトンに使用します。@staticmethodは特別な引数を受け取りません。ユーティリティに使用します。clsは実際のクラス(またはサブクラス)です。

学習を続ける

素晴らしい進み具合です。次の概念を身につけるために、このまま学習を続けてください。

よくある質問

「@classmethod と @staticmethod」レッスンは無料ですか?

はい。「@classmethod と @staticmethod」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「@classmethod と @staticmethod」で何を学びますか?

適切なデコレーターでクラスメソッドと静的メソッドを定義します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「@classmethod と @staticmethod」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 第一級オブジェクトとしての関数
  2. カスタムデコレーターの作成
  3. @property デコレーター
  4. @classmethod と @staticmethod
← Python Academyに戻る