Python中@classmethod和@staticmethod的区别
浅谈自己对@classmethod和@staticmethod区别的理解
一、@staticmethod的理解
staticmethod是一个类级别的装饰器,用于修饰类体内的函数,让实例方法编程静态方法,它和普通函数的调用作用一样,不同的是,他不需要self实例关键字,直接通过类名来进行调用。
一个简单的小例子:
1 |
|
说明:
m.test_func('syz',20)
和test.test_func('syz',20)
效果是一样的。写成静态方法的时候往往是函数体里不需要用到实例的任何属性以及方法,这时候可以使用@staticmethod
装饰器修饰,增强可读性
二、@classmethod的理解
classmethod
的作用相比staticmethod
来说,就非常大了。被@classmethod
所修饰的方法,被称之为类方法,首先,我简单较少下classmethod
和staticmethod
装饰器的区别和共同点,然后在分析@classmethod
所使用的一些场景。
共同点:
@classmethod
和@staticmethod
方法都可以通过类名.方法名来调用。将所修饰的方法转变为类级别的方法。
不同点
1.@classmethod
所修饰的方法的第一个参数必须为cls,也就是当前类。而@staticmethod
修饰的方法的参数无需cls
或者self
。
2.@classmethod
所修饰的方法所处的功能要比@staticmethod
所修饰的方法多得多。比如单例模式,工厂模式中都可以使用@classmethod
装饰器进行增强。
同时@classmethod
还常用来定义备选构造方法,对__init__
方法进行多样的增强,这点有点跟__new__
方法类似。
举个@classmethod
使用的单例模式中的例子:
1 |
|
分析:
此代码截取自我的项目中的日志模块的配置,采用单例模式,因为我对某个模块定义了多个logger,而每个logger可能再不同的模块中使用,为了避免每个模块重新生成新的日志对象,消耗内存,因此采用@classmethod
方法实现单例模式。当然单例模式也可以通过__new__
内置方法实现。
如果修改了实例中与类属性同名的属性,那么类属性并不会改变!
例子:
1 |
|
结果:
'zjw'
'syz'
说明:
即使改变了实例中与类属性同名的属性值,但是类属性并不会变。
当然了,有关@classmethod
的使用还有很多,我所理解的只是其中一小部分,它其实还可以作为工厂类的接口,用来读取或者修改工厂类本身。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!