Python中的staticmethod和classmethod区别

总所周知,在面向对象的层面来讲,Python里有三种常见的方法:静态方法(staticmethod)、类方法(classmethod)和实例方法。

class A(object):
    def foo_instance(self, x):
        #这是实例方法
        print 'runing the instance method:{params}'.format(params = (self, x))

    @classmethod
    def foo_class(cls, x):
        #这是类方法
        print 'running the class method:{params}'.format(params = (cls, x))

    @staticmethod
    def foo_static(x):
        #这是静态方法
        print 'runing the static method:{params}'.format(params = x)

上面是三种不同类型的方法在声明时的不同,在调用时,也有些许的不一样:
||实例方法|类方法|静态方法|
|:--|:--|:--|:--|
|a = A()|a.foo_instance(x)|a.foo_class(x)|a.foo_static(x)|
|A|不可用|A.class_foo(x)|A.static_foo(x)|

这里需要简单说明一下selfcls这两个参数。self
cls 分别是对类和实例的绑定,来让解释器知道这个方法里面所用到的类变量/实例变量究竟来自于哪个类/实例。需要注意的是,由于一个实例必定是一个类的具体实现,所以在调用的时候,实例可以使用类方法。

那么,实例方法、类方法和实例方法在使用场景上有什么区别呢?

  • 实例方法绑定在一个实例上,可以调用实例变量,当有实例变量使用的情况下,不能用另两种方法替代
  • 类方法绑定在一个类上,可以调用类变量但不能调用实例变量,当有和实例变量重名的类变量使用的情况下,不能用另两种方法替代
  • 静态方法不使用类的变量信息,可以使用外部方法声明

总结一下,除了少数情况下出现的区分变量作用域情况,在大多数情况下,三种方法都可以写成实例方法的形式。所不同在于,区分方法类型之后的写法可读性更好,对于其所依赖的变量环境一目了然。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,762评论 0 9
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,616评论 1 118
  • 珍惜这件事 ——我们错过的那些事 我们生活在时间的荒芜里,每天都会有人从四面八方...
    嗜血孤狼_b58f阅读 234评论 0 2
  • 一所好的学校是需要不断向前发展的,没有发展,就如死水一潭,终将会干涸;没有发展,光吃老本,势必会落伍,会被...
    晴空一鹤范祖华阅读 257评论 0 3