您的位置:首页 > 编程语言 > Python开发

Python语言特性之3:@staticmethod和@classmethod

2016-08-27 15:59 543 查看
问题:Python中
@staticmethod
@classmethod
两种装饰器装饰的函数有什么不同?

原地址http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python

Python其实有3类方法:

静态方法(staticmethod)

类方法(classmethod)

实例方法(instance method)

看一下下面的示例代码:

def foo(x):
print "executing foo(%s)" %(x)

class A(object):
def foo(self,x):
print "executing foo(%s,%s)" %(self,x)
@classmethod
def class_foo(cls,x):
print "executing class_foo(%s,%s)" %(cls,x)
@staticmethod
def static_foo(x):
print "executing static_foo(%s)" %x

a = A()

在示例代码中,先理解下函数里面的self和cls。这个self和cls是对类或者实例的绑定,对于一般的函数来说我们可以这么调用
foo(x)
,这个函数就是最常用的,它的工作和任何东西(类、实例)无关。对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是
foo(self,x)
,为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的
a.foo(x)
(其实是
foo(a,x)
)。类方法一样,只不过它传递的是类而不是实例,
A.class_foo(x)
。注意这里的self和cls可以替换别的参数,但是python的约定是这两个,尽量不要更改。

对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用时候需要使用
a.static_foo(x)
A.static_foo()
来调用。

\实例方法类方法静态方法
a = A()a.foo(x)a.class_foo(x)a.static_foo(x)
A不可用A.clas_foo(x)A.static_foo(x)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: