在 Python 中,@staticmethod 是一个装饰器,用于定义静态方法。静态方法是类中的特殊方法,它的特点是:
- 不需要接收
self(实例本身)或cls(类本身)作为第一个参数 - 不依赖于类的实例状态或类本身的状态
- 可以通过类名直接调用(推荐),也可以通过类的实例调用
- 通常用于封装与类相关但不依赖类/实例状态的工具性逻辑
静态方法的典型使用场景:
当某个功能与类相关,但不需要访问类的属性、实例的属性,也不需要修改类或实例的状态时,适合用静态方法。例如:数据验证、格式转换、简单计算等工具类功能。
脚手架示例
下面是一个包含静态方法的工具类脚手架,你可以根据需求拓展更多静态方法:
class Toolkit:
"""工具类,包含一系列静态方法用于通用功能处理"""
@staticmethod
def is_positive_number(num):
"""判断一个数是否为正数(静态方法示例1:数据验证)"""
try:
return float(num) > 0
except (ValueError, TypeError):
return False
@staticmethod
def format_name(first_name, last_name):
"""将名和姓格式化为"姓氏, 名字"的形式(静态方法示例2:格式转换)"""
if not isinstance(first_name, str) or not isinstance(last_name, str):
raise TypeError("姓名必须是字符串类型")
return f"{last_name.strip()}, {first_name.strip()}"
# 在这里可以添加更多静态方法,例如:
# @staticmethod
# def calculate_area(radius):
# """计算圆的面积"""
# import math
# return math.pi * radius **2
# 使用示例
if __name__ == "__main__":
# 1. 通过类名直接调用(推荐方式)
print(Toolkit.is_positive_number(10)) # 输出:True
print(Toolkit.is_positive_number(-5)) # 输出:False
# 2. 也可以通过实例调用(不推荐,静态方法不依赖实例)
toolkit = Toolkit()
print(toolkit.format_name("Alice", "Smith")) # 输出:Smith, Alice
# 3. 测试错误情况
try:
toolkit.format_name(123, "Smith") # 传入非字符串会报错
except TypeError as e:
print(e) # 输出:姓名必须是字符串类型
拓展说明
- 如需添加新功能,直接在类中用
@staticmethod装饰新方法即可,无需修改现有逻辑 - 静态方法内部不能直接访问类的属性(如
cls.attr)或实例的属性(如self.attr),如果需要访问,应使用类方法(@classmethod)或实例方法 - 调用静态方法时,推荐使用
类名.方法名()的方式,更能体现其“不依赖实例”的特性