对于classmethod和staticmethod 是之前学类的时候看了一下,知道是类成员方法和静态方法,今天又看到类方法,然后又搜了下,发现自己了解的并不透彻,所以总结一下。
首先classmethod 是类方法,所谓的类方法就是它的第一个参数是本类,是当前的类,它仅仅与类交互,而并不与实例进行交互。所以它是不可以访问实例变量的,但是它可以访问类变量。
对于staticmethod是静态方法,它不用传入self。而且它不可以调用类和实例中的变量。可以理解成它只是在类作用域中的一个函数而已。
普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
静态方法:由类调用;无默认参数;(可以类比下静态属性啊)
在python2.4以后 我们可以使用生成器来实现静态方法和类成员方法。
下面是一个例子:
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
@staticmethod
def staticmd():
print '静态方法,无法访问val1和val2'
@classmethod
def classmd(cls):
print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
另外,知乎上有一篇很好的文章来讲解这个,图解很好,可以看下。
https://www.zhihu.com/question/20021164