Python @staticmethod 装饰器

Python @staticmethod 语法

@staticmethod 是 Python 的一个内置装饰器,它用于将一个方法标记为静态方法。

静态方法是一种特殊的方法,它不接收类实例(self)或类(cls)作为其第一个隐含参数。也就是说,静态方法不能访问或修改类的实例状态,也不能访问或修改类本身的状态。

语法:

class MyObject:
    @staticmethod
    def 方法名(arg1, arg2, ..., argN):
        # 静态方法的实现(注意这里没有 self 或 cls 参数)

说明:

@staticmethod 需要放在方法名的上方,被 @staticmethod 装饰的方法像普通函数一样定义,是不包含 self 或 cls 参数的。

其中,静态方法可以通过类名或实例来调用。

# 通过类名调用 (推荐)
类名.方法名()

# 通过实例调用 (不推荐)
实例名.方法名()

提示:

  • @staticmethod 不会改变方法的行为,它只是改变了方法的绑定方式。
  • 静态方法不能访问实例的属性(如 self.attribute)或类属性(如 cls.class_attribute)。如果尝试访问,会引发 NameError 或 AttributeError 异常。
  • 静态方法更像是定义在类命名空间内的普通函数,它的存在仅仅是为了将相关的功能组织到类中,以提高代码的组织性和可读性。

Python @staticmethod 摘要

使用频率
官方文档 查看
相关函数 @classmethod@property

Python @staticmethod 示例

接下来,我们通过几个简单的例子来讲解一下 Python @staticmethod 是如何使用的。

示例 1:@staticmethod 基本用法

class Hero():
    count = 0
    def __init__(self, name, type):
        self.name = name
        self.type = type

    # 定义实例方法
    def skill(self):
        print(f'{self.name}放大招啦!')

    # 定义类方法
    @classmethod
    def getcount(cls):
        cls.count += 1
        print(cls.count)

    # 定义静态方法
    @staticmethod
    def add(x, y):
        print(x + y)

h1 = Hero('船长', '力量型')
# 调用静态方法
Hero.add(1,2)
h1.add(1,2)

运行结果如下。

3
3

分析:

从上面可以看出,类或实例都可以调用静态方法,这两种方式没有什么区别。其中 Hero.add(1, 2) 是通过类名来调用静态方法的,而 h1.add(1, 2) 是通过实例名来调用静态方法的。

静态方法无法访问实例属性,一般也不会和类本身进行交互,它只是起了一个类似函数工具库的作用。从这也可以看出,静态方法与普通函数差不多的。

示例 2:@staticmethod 作为辅助函数或校验器

class DateUtil:
    @staticmethod
    def is_valid_year(year):
        # 校验年份是否有效 (例如,在合理范围内)。
        # 这是一个静态方法,因为它只依赖于传入的年份参数。
        if not isinstance(year, int):
            return False
        if not (1900 <= year <= 2100):
            return False
        return True

    @staticmethod
    def format_date_display(year, month, day):
        # 格式化日期为 YYYY-MM-DD 字符串
        return f'{year:04d}-{month:02d}-{day:02d}'

# 调用静态方法进行校验
print(DateUtil.is_valid_year(2025))
print(DateUtil.is_valid_year(1899))
print(DateUtil.is_valid_year('abcd'))

# 调用静态方法进行格式化
result = DateUtil.format_date_display(2025, 5, 20)
print(result)

运行结果如下。

True
False
False
2025-05-20

分析:

在这个例子中,is_valid_year() 和 format_date_display() 都是独立的功能,它们不涉及 DateUtil 类的任何实例或类状态。这里使用 @staticmethod 将它们定义为静态方法,可以避免在创建 DateUtil 实例时对其进行实例化,直接通过类名调用,从而提高了代码的可读性。

在实际开发中,静态方法非常适用于作为类的辅助函数,例如参数校验、数据格式化等,它们与类功能相关,但不需要实例或类本身的信息。

上一篇: @classmethod

下一篇: @property

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号