Python 普通方法和staticmethod与classmethod的区别

不说废话直接Show me the code,整理来源:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python

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,发现是一个指向内存的对象

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

With classmethods, 打印显示的是A的class类型

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

我们也可以通过A.class_foo()来直接调用类方法,但是通过A.foo()这样的调用会引起TypeError.

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

classmethods 的一种使用方式是利用描述符的功能去实现可继承可变的构造函数 inheritable alternative constructors.

With static methods, 既不需要class参数也不需要self,可以通过以下两种方式进行调用

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

foo只是一个方法, 但是调用a.foo 的时候不是仅仅的得到了这个方法,我们得到了这个对象 a 的foo方法的"partially applied" ,对象a默认绑定到这个方法的第一个参数 ,方法foo 指定了两个参数,但是 a.foo实际只需要开发者传入一个参数. 我们来对方法进行打印来进一步看看里面的奥妙.

对象a是绑定到foo()这个方法上的:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

我们接下来调用a.class_foo, 发现对象a 不是绑定到class_foo这个方法上,而是类A绑定到方法class_foo上.

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

staticmethod 就更直接,什么也不绑定

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

通过类调用也是一样的.

print(A.static_foo)
# <function static_foo at 0xb7d479cc>

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 79,703评论 12 120
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    萌萌的小伟哥阅读 544评论 0 1
  • 1.对缺省参数的理解。给出代码 缺省参数在python中是与函数绑定在一起的。也就是说,一个函数中定义了一个缺省参...
    晓可加油阅读 1,558评论 0 27
  • 西风向更高的地方飘去,他不知道自己要去哪里,也不知道自己会去哪里,被莫名的力量扯动着向星辰深处、银河腹地、嫦娥行宫...
    纪霏嫣阅读 49评论 1 3
  • 都说柴静的《看见》是一本很好的书。 关于柴静,我第一次知道她的时候是她的纪录片《苍穹之下》被封杀。 对于她,我并没...
    小吴小吴多读书阅读 25评论 0 0