# 类方法与静态方法

URL: https://caijiao.org/python/ch08/class-static
Source: docs/python/ch08/class-static.md
Description: 本章介绍 Python 中的类方法 '@classmethod' 和静态方法 '@staticmethod'，它们分别与类和对象的实例无关，具有特定用途。

[Python](/python/) 中的类方法和静态方法是类的两种特殊方法，它们可以在没有创建实例的情况下调用。

## 类方法 `@classmethod`

类方法是与类本身相关联的方法，而不是与对象的实例相关联。它通过 `cls` 参数访问类的属性和方法。

```python
class Dog:
    species = "Canine"  # 类属性

    def __init__(self, name):
        self.name = name

    @classmethod
    def get_species(cls):
        return cls.species

print(Dog.get_species())  # 输出：Canine
```

`@classmethod` 修饰的方法，第一个参数是类本身 (`cls`)，可以访问类属性并进行修改。

## 静态方法 `@staticmethod`

静态方法与类和实例都无关，它是普通的函数，只是定义在类的作用域内。静态方法不需要接受 `self` 或 `cls` 参数。

```python
class Calculator:
    @staticmethod
    def add(a, b):
        return a + b

print(Calculator.add(5, 3))  # 输出：8
```

静态方法不访问类的属性或方法，适用于与类或实例无关的功能。

## 类方法与静态方法的区别

| 特性       | 类方法 (`@classmethod`)    | 静态方法 (`@staticmethod`) |
| ---------- | -------------------------- | -------------------------- |
| 第一个参数 | `cls` (类本身)             | 无 `self` 或 `cls` 参数    |
| 访问范围   | 可以访问类属性和类方法     | 不能访问类属性或类方法     |
| 使用场景   | 用于需要访问或修改类的状态 | 用于与类及其实例无关的功能 |

## 总结

- 类方法用于操作类的状态，通常用来定义工厂方法；
- 静态方法不依赖于类或实例，适用于类的独立功能；
- 使用 `@classmethod` 和 `@staticmethod` 修饰符来分别定义类方法和静态方法。
