【零碎知识】【Python】@classmethod 与 @staticmethod

简介: 【零碎知识】【Python】@classmethod 与 @staticmethod

@classmethod 与 @staticmethod这两个方法很容易混淆,因为使用时都是通过类名直接调用其方法,与实例无关。下面记录下两者的区别。

@classmethod

在Python中,@classmethod是一个装饰器,用于将一个方法标记为类方法。类方法是与类关联的方法,而不是与类的实例关联的方法

使用@classmethod装饰器可以使方法在类级别上执行,而不是在实例级别上执行。这意味着你可以直接通过类名调用该方法,而不是通过类的实例调用该方法。

下面是一个简单的示例,展示了如何使用@classmethod装饰器:

class MyClass:
    
    @classmethod
    def my_classmethod(cls, arg1, arg2):
        return cls, arg1, arg2
# 调用类方法
result = MyClass.my_classmethod("hello", "world")
print(result)  # 输出: (<class '__main__.MyClass'>, 'hello', 'world')

在上面的示例中,my_classmethod是一个类方法,它接受两个参数arg1arg2。使用@classmethod装饰器后,可以直接通过类名MyClass来调用该方法。该方法的第一个参数是类本身,通常使用cls作为参数名来接收。在方法体内部,可以直接使用类名而不是实例来访问属性和其他方法。

@staticmethod

@staticmethod装饰器将一个方法变为静态方法。这意味着这个方法不访问类的属性或方法,也不接受隐式的cls参数。静态方法本质上就是一个普通的函数,只是它被定义在类内部。

示例:

class MyClass:
    @staticmethod
    def my_static_method(param1, param2):
        print(f"MyClass.my_static_method received {param1} and {param2}")
MyClass.my_static_method("value1", "value2")  # 输出: MyClass.my_static_method received value1 and value2

@classmethod 与 @staticmethod的不同

  1. 参数传递:
  • @classmethod装饰的类方法需要传入类参数cls,它表示类本身,并且在调用类方法时,Python会自动将类本身作为第一个参数传递给方法。这使得类方法可以访问和修改类状态。
  • @staticmethod装饰的静态方法不需要表示自身对象的self和自身类的cls参数(这两个参数都不需要添加),因此它无法访问类的属性和方法。静态方法更像是在类的命名空间中定义的普通函数,它们只是在类的定义中,以便在逻辑上与类保持相关性。
  1. 使用场景:
  • 类方法常用于工厂模式,创建类的实例。由于在类方法中可以使用cls参数来引用类本身,并可以调用类的其他方法或修改类状态,因此类方法可以在不创建类实例的情况下对类进行操作。
  • 静态方法通常用于执行与类相关但与特定实例无关的操作。它们不依赖于对象状态,也不修改类状态。静态方法只是通过类来调用,以便在逻辑上与类保持关联。

以上大部分回答来自 文心一言,有时候利用大模型查问题真的非常方便。

相关文章
|
8月前
|
缓存 Java Python
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
|
5月前
|
C++ Python
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
48 1
|
8月前
|
SQL 分布式计算 算法
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用
|
Python
Python @classmethod和@staticmethod装饰器使用介绍
Python @classmethod和@staticmethod装饰器使用介绍
95 0
|
Python
Python中三个装饰器函数用法(property、staticmethod、classmethod )
Python中三个装饰器函数用法(property、staticmethod、classmethod )
137 0
|
Python
python小知识-classmethod类方法
类方法:@classmethod装饰的方法,参数有一个隐含参数cls,表示类本身,类可以直接调用
234 0
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
21天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
105 80
|
10天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
33 14