参考文章:
https://www.cnblogs.com/taceywong/p/5813166.html
其实我只做了小小的一点改动,方便自己理解。
Python其实有3类方法:
- 静态方法(staticmethod)
- 类方法(classmethod)
- 实例方法(instance method)
def foo(x):
print (" foo %s" %x)
class A(object):
def foo(self,x):
print (" foo %s" %x)
@classmethod
def class_foo(cls,x):
print (" class_foo %s" %x)
@staticmethod
def static_foo(x):
print (" static_foo %s " %x)
a = A()
foo('foo')
a.foo('instance')
A.class_foo('class') #a.class_foo('class') 类方法是给类用的,如果实例要用也行,就是比较奇怪
a.static_foo('static')
结果为:
foo foo
foo instance
class_foo class
static_foo static
在示例代码中,先理解下函数里面的self和cls,这个self和cls是对实例或者类的绑定。
其中,self对应实例
cls对应类
1.对于在类外面定义的一般的函数,我们可以这么调用:foo(x)
,这个函数就是最常用的,它的工作和任何东西(类、实例)无关。
2.对于实例方法,类的方法与普通的函数只有一个特别的区别——它们在定义时必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。而且语法规定,每次定义方法的时候(注意,不是使用时,而是定义时)都需要绑定这个实例,就是foo(self,x)
,为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)
(其实是foo(a,x)
)。
3.对于类方法,和实例方法一样,也有一个额外的参数,叫做cls,只不过它传递的是类而不是实例,A.class_foo(x),即class_foo(A,x)
注意,这里的self和cls可以替换别的参数,但是python的约定是这两个,尽量不要更改。
4.对于静态方法,其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用时候需要使用a.static_foo(x)
或A.static_foo()
来调用。