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 分别是对类和实例的绑定,来让解释器知道这个方法里面所用到的类变量/实例变量究竟来自于哪个类/实例。需要注意的是,由于一个实例必定是一个类的具体实现,所以在调用的时候,实例可以使用类方法。

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

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

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

你可能感兴趣的:(Python中的staticmethod和classmethod区别)