python中有三种方法,静态方法,类方法,实例方法
def foo(x):
print "executing foo(%s)"%(x)
# object是为了让代码有兼容python2.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(x)
来调用.
实例方法 | 类方法 | 静态方法 | |
---|---|---|---|
a = A() | a.foo(x) | a.class_foo(x) | a.static_foo(x) |
A | 不可用 | A.class_foo(x) | A.static_foo(x) |
在C++中一个源程序文件,在内存中运行时会有,静态数据区(局部静态,全局静态),代码区,堆栈区(动态数据区),静态数据是对该作用域私有的,静态变量可以改变,并且局部静态变量在本次运行的前后次调用函数的值会保持统一