当前位置: 首页 > 图灵资讯 > 行业资讯> Python之classmethod和staticmethod的区别

Python之classmethod和staticmethod的区别

发布时间:2025-10-23 16:04:58

python中有三种方法定义类,常规方法,@classmethod修改方法,@staticmethod修改方法。

classA(object):
deffoo(self,x):
print('调用foo函数(%)s,%s)'%(self,x))
print('self:',self)
@classmethod
defclass_foo(cls,x):
print('调用class_foo函数(%)s,%s)'%(cls,x))
print('cls:',cls)
@staticmethod
defstatic_foo(x):
print('调用static_foo函数(%)s)'%(x))
a=A()

1. 定义方式

普通foo()函数需要self参数隐式传递当前对象的实例。@classmethod修改class_foo()当前类对象需要通过cls参数传输。@staticmethod修改的方法定义与普通函数相同。

self和cls的区别不是强制性的,而是PEP8中的一种编程风格。slef通常用作实例方法的第一参数,cls通常用作类别方法的第一参数。也就是说,当前类别对象的实例通过self传递,当前类别对象通过cls传递。

2. 绑定对象

Foo方法绑定对象A的示例
print(a.foo)
<boundmethodA.fooof<__main__.0x100721cf8>>
class_foo方法绑定对象A
print(a.class_foo)
<boundmethodA.class_fooof<class'__main__.A'>>
static_foo没有参数绑定。
print(a.static_foo)
<functionA.static_fooat0x1007773>

相关推荐:Python视频教程

3. 调用的方式

foo可以通过实例a调用,类对象A可以直接调用参数错误。

print(a.foo(1))
调用foo函数(<__main__.0x10245cf8>,1)
self:<__main__.0x10245cf8>
print(A.foo(1))
Traceback(mostrecentcalllast):
File"/Users/liuhuiling/Desktop/MT_code/OPUnittest/case/demo.py",line63,in<module>
print(A.foo(1))
TypeError:foo()missing1requiredpositionalargument:'x'

class_foo可以通过类对象A 或者调用对象实例a。

a.class_foo(2)
A.class_foo(2)
调用class_foo函数(<class'__main__.A'>,2)
cls:<class'__main__.A'>

static_foo可以通过类对象A 或者调用对象实例a。

a=A()
a.static_foo(3)
A.static_foo(3)
调用static_foo函数(3)

4. 继承就像覆盖普通类函数一样。

classC(A):
pass
c=C()
c.foo(1)
c.class_foo(1)
c.static_foo(1)

运行结果:

调用foo函数(<__main__.Bobjectat0x10246a>,1)
self:<__main__.Bobjectat0x10246a>
调用class_foo函数(<class'__main__.B'>,1)
cls:<class'__main__.B'>
调用static_foo函数(1)

相关文章

python如何通过日志分析加入黑名单

python如何通过日志分析加入黑名单

2025-10-23
Python之classmethod和staticmethod的区别

Python之classmethod和staticmethod的区别

2025-10-23
Python3中的数字(Number)

Python3中的数字(Number)

2025-10-23
Python如何使用数据库的连接池

Python如何使用数据库的连接池

2025-10-23
Python如何实现邮件的发送

Python如何实现邮件的发送

2025-10-23
Python3条件控制

Python3条件控制

2025-10-23