热门搜索 :
考研考公
您的当前位置:首页正文

如何区分对象方法,类方法和静态方法

来源:东饰资讯网
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>
Top