class 是用来定义一个物件型态的工具,像是 int、str 一样,但更灵活,因为你可以完全自定义属性(资料)和方法(行为)。这使得 class 成为实现面向物件程式设计 (Object-Oriented Programming, OOP) 的基石。

更多有关于class文章:Python 类别 class方法解析顺序 (MRO, Method Resolution Order) Python 装饰器 (decorator): @staticmethod@classmethod 是 Python 中的一个装饰器 (decorator),用来定义类别方法 (class method)。与一般的实例方法不同,类别方法是直接与类别本身相关联的,而不是物件实例。

特点

  • 类别方法的第一个参数是类别本身,约定俗成地命名为 cls。
    • cls 是类别的参考(类似于实例方法中的 self)。
    • 它允许你访问类别层级的属性或方法。
  • 类别方法可以由类别本身或类别的任何实例调用。
  • 使用 @classmethod 定义的方法,常用于创建类别的辅助功能,例如工厂方法。
  • 语法

    class MyClass:
    @classmethod
    def class_method(cls, arg1, arg2):
    # cls 指向类别
    pass

    范例 1:访问类别属性

    class Dog:
    species = "Canine" # 类别属性

    @classmethod
    def get_species(cls):
    return cls.species # 访问类别属性

    # 类别本身调用
    print(Dog.get_species()) # Canine

    # 物件实例调用
    buddy = Dog()
    print(buddy.get_species()) # Canine

    范例 2:工厂方法

    类别方法常用于创建物件的工厂方法,用来基于不同的输入创建物件。

    class Person:
    def __init__(self, name, age):
    self.name = name
    self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
    # 根据出生年份计算年龄并创建物件
    age = 2024 - birth_year
    return cls(name, age) # 使用 cls 创建物件

    # 使用普通初始化
    p1 = Person("Alice", 30)
    print(p1.name, p1.age) # Alice 30

    # 使用类别方法初始化
    p2 = Person.from_birth_year("Bob", 1995)
    print(p2.name, p2.age) # Bob 29

    范例 3:与 @staticmethod 的比较

    @staticmethod 是另一个装饰器,用来定义静态方法(不需要 self 或 cls)。装饰器 使用场景 是否需要 self 或 cls@classmethod 操作类别属性,创建工厂方法 需要 cls(代表类别)@staticmethod 状态独立的工具函数 不需要 self 或 cls

    范例对比:

    class Example:
    counter = 0 # 类别属性

    @classmethod
    def increment(cls):
    cls.counter += 1 # 操作类别属性
    return cls.counter

    @staticmethod
    def greet():
    return "Hello!"

    print(Example.increment()) # 1
    print(Example.greet()) # Hello!

    更多有关于class文章: Python 装饰器 (decorator): @staticmethod