Python类方法与静态方法详解:定义、调用与区别

Owen
Owen
发布时间:2026-10-14| 2人浏览过
原创

本文深入解析Python中的类方法与静态方法。通过@classmethod和@staticmethod装饰器,分别实现与类对象关联及与类无关的操作。详细对比三者在对实例属性、类属性的访问权限及调用方式上的差异,帮助开发者规范代码结构,提升面向对象编程效率。

类方法的定义与使用

1. 类方法

类方法是绑定到“类对象”而非实例对象的方法。在Python中,可以通过 @classmethod 装饰器来定义类方法,其基本语法格式如下:


@classmethod
def 类方法名(cls [, 形参列表]):
	方法体

使用类方法时需注意以下关键点:

  1. @classmethod 装饰器必须紧贴在方法定义行的上方。
  2. 类方法的第一个参数必须是 cls(即 class 的缩写),这与实例方法中的 self 类似,但 cls 代表的是类对象本身。
  3. 调用类方法的格式为:类名.类方法名(参数列表)。在调用时,参数列表中无需也不应显式传递 cls 参数,Python 解释器会自动将类对象作为第一个参数传入。
  4. 在类方法内部,尝试访问或修改实例属性和实例方法会引发错误,因为类对象的存在并不保证对应的实例对象一定存在。
  5. 当子类继承父类的类方法时,传入的 cls 参数是子类对象,而非父类对象(后续章节将详细展开此继承机制)。

代码示例:


class Student:
  count = 0    # 类属性

  """定义方法"""
  @classmethod
  def print_count(cls):
    """cls参数代表类对象"""
    print(Student.count)


"""调用类方法"""
print("调用时,不传递cls参数")
Student.print_count()

运行结果:

调用时,不传递cls参数 0

静态方法的定义与使用

2. 静态方法

在Python中,可以定义与“类对象”无直接关联的方法,称为“静态方法”。 静态方法与在模块级别定义的普通函数几乎没有区别,唯一的区别是静态方法被放置在“类的命名空间”内,因此必须通过类来调用。 静态方法通过 @staticmethod 装饰器进行定义,具体格式如下:


@staticmethod
def 静态方法名([形参列表]):
	方法体

使用静态方法时需注意以下要点:

  1. @staticmethod 装饰器必须位于方法定义行的上方。
  2. 调用静态方法的格式为:类名.静态方法名(参数列表)。
  3. 在静态方法内部,尝试访问实例属性或实例方法会导致错误,因为静态方法不接收 self 或 cls 参数。

代码示例:


class Student:
  count = 0      # 类属性

  @staticmethod
  def add(a, b):
    """与类无关的静态方法"""
    """因为静态方法从属于类,所以是可以操作类属性和类方法"""
    print("{0}+{1}={2}".format(a, b, a+b))
    return a + b


# 调用静态方法
Student.add(20, 30)

运行结果:

20+30=50 res=50

三种方法的区别对比

3. 实例方法、类方法与静态方法的区别


class MyClass:
  # 类属性
  class_attr = 0

  def __init__(self, obj_attr):
    self.obj_attr = obj_attr

  def instance_method(self):
    return "instance method called", self

  @classmethod
  def class_method(cls):
    return "class method called", cls

  @staticmethod
  def static_method():
    return "static method called"


print("调用实例方法")
obj1 = MyClass("obj_attr1")
print(obj1.instance_method())

print("--" * 20)
print("调用类方法")
print(MyClass.class_method())

print("--" * 20)
print("调用静态方法")
print(MyClass.static_method())

运行结果:

调用实例方法 ('instance method called', <__main__.MyClass object at 0x10ca93310>) ---------------------------------------- 调用类方法 ('class method called', <class '__main__.MyClass'>) ---------------------------------------- 调用静态方法 static method called

注意:以下讨论涉及的属性和方法均指公开类型,不包括私有成员。

实例方法:

  1. 可以读取和修改实例属性。
  2. 可以调用其他实例方法。
  3. 可以读取和修改类属性。
  4. 可以调用类方法。
  5. 可以调用静态方法。
  6. 调用方式:对象名.实例方法名(参数列表),编译器会自动传递 self 参数。

类方法:

  1. 不能读取或修改实例属性。
  2. 不能调用实例方法。
  3. 可以读取和修改类属性。
  4. 可以调用其他类方法。
  5. 可以调用静态方法。
  6. 调用方式:类名.类方法名(参数列表),编译器会自动传递 cls 参数。

静态方法:

  1. 不能读取或修改实例属性。
  2. 不能调用实例方法。
  3. 可以读取和修改类属性。
  4. 可以调用类方法。
  5. 可以调用其他静态方法。
  6. 调用方式:类名.静态方法名(参数列表),无需传递 cls 或 self 参数。
  7. 类方法和静态方法在功能上非常相似,甚至可以相互替代。但从代码规范的角度来看,建议遵循以下原则:实例方法用于操作对象状态,类方法用于操作类级状态,而静态方法则用于处理与类和实例都无关的通用逻辑。

以上就是关于Python类方法与静态方法的详细内容,更多关于类方法/静态方法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。