Python 中的 classmethod 和 staticmethod 有什么具体用途?

本文通过三个步骤详细解析了Python中@classmethod和@staticmethod的定义、使用场景及背后的原理。适合初学者快速掌握这两种方法的区别与应用。

转自 http://www.zhihu.com/question/20021164

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:bravez
链接:http://www.zhihu.com/question/20021164/answer/64413438
来源:知乎

1、先看:
Python 中的 classmethod 和 staticmethod 有什么具体用途? - 李保银的回答
讲明白了:@classmethod和@staticmethod是什么。
2、再看:
oop - Python @classmethod and @staticmethod for beginner?
讲明白了:什么时候用、怎么用。
3、继续:
oop - Python @classmethod and @staticmethod for beginner?
这个答案是对2的补充。
讲明白了:为什么要这么用。

Python面向对象编程中,`@staticmethod` `@classmethod` 是两个常用的装饰器,它们可以改变方法的调用方式行为,二者存在以下区别: ### 调用方式 - **`@staticmethod`**:可以被类直接调用,也能被类的实例调用。例如: ```python class A(object): @staticmethod def static_foo(x): print(f"executing static_foo({x})") # 类直接调用 A.static_foo('hi') # 实例调用 a = A() a.static_foo(1) ``` - **`@classmethod`**:同样既可以被类直接调用,也能被类的实例调用。例如: ```python class A(object): @classmethod def class_foo(cls, x): print(f"executing class_foo({cls}, {x})") # 类直接调用 A.class_foo(1) # 实例调用 a = A() a.class_foo(1) ``` ### 参数传递 - **`@staticmethod`**:不需要额外的默认参数,就像普通函数一样,调用时传入定义的参数即可。如上述代码中的 `static_foo(x)` ,只需要传入 `x` 参数。 - **`@classmethod`**:第一个参数必须是类本身,通常约定为 `cls` 。这个参数在调用时由Python自动传入,代表调用该方法的类。例如上述代码中的 `class_foo(cls, x)` ,`cls` 代表类 `A` [^2][^3][^4]。 ### 功能用途 - **`@staticmethod`**:主要用于把类相关的一些实用工具函数组织到类中,逻辑上属于类,但不需要访问类或实例的属性方法,更像是一个独立的函数,只是放在类的命名空间下,有利于代码的组织命名空间的整洁 [^1]。 - **`@classmethod`**:常用于实现与类相关的工厂方法,通过类本身来创建实例,或者修改类级别的属性。因为它可以访问类,所以可以根据类的不同状态创建不同的实例 [^2]。 ### 对类属性的访问 - **`@staticmethod`**:不能直接访问类属性,因为它没有传入类或实例的引用。 - **`@classmethod`**:可以通过 `cls` 参数访问修改类属性,能够对类的状态进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值