Staticmethod和classmethod的区别
文章来源:Staticmethod和classmethod的区别 - 代码领悟code05.com
提问:Staticmethod和classmethod的区别
用@staticmethod
修饰的函数和用@classmethod
修饰的函数有什么区别?
回答:
也许一些示例代码会有所帮助:注意foo
,class_foo
和A
的调用签名的差异:
class A(object):
def foo(self, x):
print(f"executing foo({self}, {x})")
@classmethod
def class_foo(cls, x):
print(f"executing class_foo({cls}, {x})")
@staticmethod
def static_foo(x):
print(f"executing static_foo({x})")
a = A()
下面是对象实例调用方法的常用方式。 对象实例a
作为第一个参数隐式传递。
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
使用classmethods,对象实例的类作为第一个参数隐式传递,而不是self
。
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
您也可以使用类调用class_foo
。 事实上,如果你定义的东西是 一个classmethod,这可能是因为你打算从类而不是从类实例调用它。 A.foo(1)
会引发一个TypeError,但是A.class_foo(1)
工作得很好:
A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
人们为类方法找到的一个用途是创建可继承的替代构造函数。
使用staticmethods,self
(对象实例)和cls
(类)都不会隐式传递作为第一个参数。 它们的行为就像普通函数,除了你可以从实例或类中调用它们:
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
Staticmethods用于将与类具有某种逻辑连接的函数分组到类。
foo
只是一个函数,但是当你调用a.foo
时,你不只是得到函数, 您将获得函数的"部分应用"版本,对象实例a
绑定为函数的第一个参数。 foo
期望2个参数,而a.foo
只期望1个参数。
a
绑定到foo
。 这就是下面"绑定"一词的含义:
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
使用a.class_foo
,a
不绑定到class_foo
,而是类A
绑定到class_foo
。
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
在这里,使用staticmethod,即使它是一个方法,a.static_foo
只是返回 一个好的'ole函数,没有参数绑定。 A
期望1个参数,并且 a.static_foo
也期待1个论点。
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
当然,当你用类A
调用A
时,也会发生同样的事情。
print(A.static_foo)
# <function static_foo at 0xb7d479cc>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言