(写的时候感觉怪怪的,后面发现是类名首字母没有大写,不改了,请见谅)
对python中的类来说,可以有类方法,静态方法,实例方法三种方法。
这三种方法里面,实例方法应该是大家最熟悉的一种方法。其标志就是方法的第一个参数为self,通过类的实例来调用,调用时会默认将实例对象作为self参数传入。当然也可以通过类调用实例方法,手动传实例进去。见下图。
我们可以看到两种方式调用结果是一样的。实际上第二种调用方式,我们不传c实例进去,比如calculator.times(a,2,3)也能得到6,当然如果times中对实例进行操作的话就会报错了。
类方法
python中使用@classmethod装饰器来装饰类方法。所以,类方法的特征有两个:一是 @classmethod 装饰器;二是方法的第一个参数为cls ,代表所属的类,类方法可以通过cls来操作类的属性和方法。
这里提一嘴,@classmethod装饰器中的classmethod并不是函数,而是一个类。我们知道类其实也是可调用对象(可参见我关于可调用对象的文章),classmethod(func) = classmethod.__ init __(func),对吧。classmethod的源码是c编的,我们看不到,就不深究下去了,就知道装饰以后是类方法就可以了。
类的方法可以通过类或者实例来调用,并可以通过cls参数访问类的属性和方法。如下图所示。我们通过calculator类和c实例都可以调用minus类方法,并且可以访问类的属性name。
需要注意的是,类不能访问实例的方法(是指calculator.times(a,b)这种,上面通过手动传实例不算),这是因为实例继承了类的属性和方法,而类不可能实例初始化出来的属性等等。
静态方法
python中对静态方法也有一个装饰器@staticmethod来进行标识。静态方法也是通过类或者实例来调用的,但是不能直接调用,这有点我们调用模块中方法的感觉。import module1;module1.func();对吧,静态方法‘属于’类,我们通过类找到静态方法,当然类的实例继承了相关的信息,也可以调用静态方法。如下图。结果我不贴上来了,都是一样的。
另外我们想静态方法能不能‘直接’调用类的静态属性呢?试一下。
发现报错了。那我们加nonlocal 或者global 试一下呢?
结果我不贴了,也都报错了。
后面我还做了一些验证,例如使用global的时候,在类的外面定义name = ‘123’,这时没有报错,print的是‘123’。有兴趣可以自己试一下。
所以这个地方,类中的静态属性的变量名应该是类似calculator.name这样,即使是类内部也无法通过name直接访问。
子类继承
这三种方法,子类都可以从父类继承,很好验证,同样图不贴了。
以上。