Menu
Coddy logo textTech

クラスメソッドデコレータ

CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 12/64。

@classmethodデコレータは、インスタンス(self)の代わりにクラス自体を第1引数(cls)として受け取るメソッドを作成します。

クラスメソッドを持つクラスの例を以下に示します。

class Student:
    school_name = "Python Academy"
    student_count = 0
    
    def __init__(self, name):
        self.name = name
        Student.student_count += 1
    
    @classmethod
    def get_school_info(cls):
        return f"School: {cls.school_name}, Students: {cls.student_count}"
    
    @classmethod
    def create_guest_student(cls):
        return cls("Guest")

クラス名を使用してクラスメソッドを呼び出します:

info = Student.get_school_info()
print(info)

学生を数人作成します:

alice = Student("Alice")
bob = Student("Bob")

updated_info = Student.get_school_info()
print(updated_info)

クラスメソッドを代替のコンストラクタとして使用します:

guest = Student.create_guest_student()
print(guest.name)
print(Student.get_school_info())

出力:

School: Python Academy, Students: 0
School: Python Academy, Students: 2
Guest
School: Python Academy, Students: 3

クラスメソッドはインスタンスからも呼び出すことができます:

alice = Student("Alice")
info_from_instance = alice.get_school_info()
print(info_from_instance)

出力:

School: Python Academy, Students: 1

重要なポイント: クラス属性にアクセスする必要がある場合や、オブジェクトを構築するための代替手段を作成する必要がある場合は、@classmethod を使用します。最初のパラメータは self ではなく、cls(クラス自体)です。

チートシート

@classmethod デコレータは、インスタンス (self) の代わりにクラス自体を第1引数 (cls) として受け取るメソッドを作成します。

class Student:
    school_name = "Python Academy"
    student_count = 0
    
    def __init__(self, name):
        self.name = name
        Student.student_count += 1
    
    @classmethod
    def get_school_info(cls):
        return f"School: {cls.school_name}, Students: {cls.student_count}"
    
    @classmethod
    def create_guest_student(cls):
        return cls("Guest")

クラス名を使用してクラスメソッドを呼び出します:

info = Student.get_school_info()
guest = Student.create_guest_student()

クラスメソッドはインスタンスからも呼び出すことができます:

alice = Student("Alice")
info_from_instance = alice.get_school_info()

クラス属性にアクセスする必要がある場合や、オブジェクトを構築する別の方法を作成する場合に @classmethod を使用します。

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン