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()
a.foo(1)
a.class_foo(2)
a.static_foo(3)
print '--------'
A.class_foo(4)
A.static_foo(5)
print '--------'
print a.foo
print a.class_foo
print a.static_foo
executing foo(<__main__.A object at 0x106ad2190>,1)
executing class_foo(<class '__main__.A'>,2)
executing static_foo(3)
--------
executing class_foo(<class '__main__.A'>,4)
executing static_foo(5)
--------
<bound method A.foo of <__main__.A object at 0x106ad2190>>
<bound method type.class_foo of <class '__main__.A'>>
<function static_foo at 0x106ad1500>
解析
对象方法只能用类的实例对象调用,A.foo(1)会报错,对象方法默认将对象实体a传递给方法的第一个参数(self);
类方法默认传递给第一个参数的是类(class A),通常用变量cls表示,而不是self。类方法既可以用类名调用也可以用类的实例调用。
以上所说默认传递第一个参数,为什么呢?
a.foo 仅仅需要一个参数,是因为foo函数默认是绑定到a这个对象上的
print a.foo
<bound method A.foo of <__main__.A object at 0x106ad2190>>
a.class_foo 是A绑定到class_foo而不是 a;
最后剩下静态方法,说到底它就是一个方法.a.static_foo只是返回一个不带参数绑定的方法.static_foo和a.static_foo只需要一个参数.
print a.static_foo
<function static_foo at 0x106ad1500>