Python类方法详解:@classmethod与@staticmethod的区别与应用

拾柒
拾柒
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Python中的类方法与静态方法。通过对比类属性与实例属性,详细阐述@classmethod装饰器如何将类对象作为第一个参数cls传递,以及@staticmethod如何定义与类无直接关系但属于类命名空间的独立函数。文章包含完整代码示例,帮助开发者掌握这两种方法在代码维护与调用方式上的核心区别。

前言

前言

近期文章阅读量表现平平,具体原因尚不明确。如果您发现文中存在错误或表达不清之处,欢迎通过后台或微信联系我指正,在此先致谢。

在昨天的文章《详解类方法之绑定方法与非绑定方法》中,我们探讨了绑定方法与非绑定方法的概念。今天我们将继续深入,学习剩余的两种重要方法:「类方法」和「静态方法」。

类方法与静态方法概述

类方法与静态方法概述

在正式讲解之前,请先观察以下代码示例:


class Sample:
 language = "C++"
 def __init__(self):
 self.language = "python"

def get_class_attr(cls):
 return cls.language

if __name__ == "__main__":
 print("sample.language:",Sample.language)
 r = get_class_attr(Sample)
 print("get class attribute:",r)
 f = Sample()
 print("instance attribute:",f.language)

在上述代码的类 Sample 中,定义了一个名为 language 的属性并赋值为 “C++”,这属于「类属性」;而在初始化方法 __init__ 中,定义了 self.language 并赋值为 “python”,这属于「实例属性」。

明确上述概念后,我们来分析函数 get_class_attr(cls)。该函数的参数为 cls,从函数体内部逻辑来看,它要求传入的对象必须具有 language 属性,这意味着并非任意对象都能调用此函数。恰好前文定义的类 Sample 拥有该属性,因此在调用时,直接将类对象作为参数传入 get_class_attr()。

Sample.language 用于获取类属性的值,而 get_class_attr(Sample) 返回的同样是类 Sample 的属性 Sample.language 的值。因此,在前述示例中,前两个 print() 语句的输出结果应当一致。

f = Sample() 这一行代码创建了一个实例,随后通过 f.language 访问实例属性。基于上述代码,运行结果如下所示:


sample.language:C++
get class attribute:C++
instance attribute:python

经过上述解释,如果您仍感到困惑,建议重新对比运行结果与分析过程,仔细体会类属性与实例属性的区别。

在前例中,get_class_attr(cls) 函数定义在类外部,但它只能调用特定的类对象,因为并非所有对象都具备 language 属性。这种将函数置于类外的写法不利于后期维护,因此我们应避免此类情况。解决之道是将函数封装在类内部,即采用如下写法:


class sample:
 language = "C++"
 def __init__(self):
 self.language = "python"

 @classmethod
 def get_class_attr(cls):
 return cls.language

if __name__ == "__main__":
 print("sample.language:",sample.language)
 r = sample.get_class_attr()
 print("get class attribute:",r)
 f = sample()
 print("instance attribute:",f.language)
 print("instance get_class_str:",f.get_class_attr())

在修改后的代码中,出现了 @classmethod 装饰器,此前在函数章节中曾提及。需要注意的是,@classmethod 装饰的方法其第一个参数不再是 self,这与常规类方法不同。此处习惯使用参数 cls,当然使用其他名称亦可。让我们查看运行结果:

sample.language:C++ get class attribute:C++ instance attribute:python instance get_class_str:C++

从运行结果可见,无论是通过类还是实例调用 get_class_attr(),得到的结果均为类属性的值。这表明 @classmethod 装饰的方法中,参数 cls 引用的是类对象 Sample 本身。

类方法的定义与特性

至此,「类方法」的定义清晰:类方法是在类内部定义的方法,由 @classmethod 装饰,其第一个参数 cls 引用的是类对象,即将类本身作为引用对象传入该方法。

理解类方法后,我们可以用类似思路理解「静态方法」。首先请看以下代码:


import random

def judge(n):
 num = random.randint(1,100)
 return num - n > 0

class Sample:
 def __init__(self,name):
 self.name = name

 def get_name(self,age):
 if judge(age):
  return self.name
 else:
  return "the name is stupid"

if __name__ == "__main__":
 s = Sample('rocky')
 name = s.get_name(23)
 print(name)

观察上述代码,类 Sample 中调用了外部的函数 judge(n)。由于类与外部函数的这种松散关联可能导致后期维护问题,因此我们对程序进行了优化修改:


import random

class Sample:
 def __init__(self,name):
 self.name = name

 def get_name(self,age):
 if self.judge(age):
  return self.name
 else:
  return "the name is stupid"
 @staticmethod
 def judge(n):
 num = random.randint(1,100)
 return num - n > 0

if __name__ == "__main__":
 s = Sample('rocky')
 name = s.get_name(23)
 print(name)

经过修改优化,原本在类外部的函数被移至类内部。但这并非简单移动,还需在函数前添加 @staticmethod 装饰器。值得注意的是,尽管该函数位于类内部,但其行为与其他方法不同,第一个参数也不是 self。使用时,既可以通过实例调用(如 self.judge(n)),也可以通过类直接调用(如 sample.select(n))。

从程序可以看出,尽管 judge(n) 位于类内部,但它实质上是一个独立方法,与类本身无直接关联,仅为了消除前述的维护麻烦而存在。该例充分说明了其存在的合理性。

静态方法的定义与特性

因此,「静态方法」的定义如下:在类的作用域内,函数前必须添加 @staticmethod 装饰器,此类方法被称为静态方法。

结语

结语

方法是类的重要组成部分。本章介绍的类方法与静态方法,为使用类提供了更为便捷的工具。

关于「方法」的讲解至此告一段落,后续我们将继续学习面向对象编程(OOP)的剩余两个特征:「多态」和「封装」,敬请期待。

如果您觉得本文对您有所帮助,欢迎点赞转发。您的支持是我创作的最大动力,分享永不止步,让我们一起加油。

文章结束。

以上是关于Python类方法与静态方法的详细内容,更多关于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 算法库。