(写的时候感觉怪怪的,后面发现是类名首字母没有大写,不改了,请见谅)
对python中的类来说,可以有类方法,静态方法,实例方法三种方法。

这三种方法里面,实例方法应该是大家最熟悉的一种方法。其标志就是方法的第一个参数为self,通过类的实例来调用,调用时会默认将实例对象作为self参数传入。当然也可以通过类调用实例方法,手动传实例进去。见下图。

【PYTHON】类方法、静态方法和实例方法
【PYTHON】类方法、静态方法和实例方法
我们可以看到两种方式调用结果是一样的。实际上第二种调用方式,我们不传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。
【PYTHON】类方法、静态方法和实例方法
【PYTHON】类方法、静态方法和实例方法
需要注意的是,类不能访问实例的方法(是指calculator.times(a,b)这种,上面通过手动传实例不算),这是因为实例继承了类的属性和方法,而类不可能实例初始化出来的属性等等。

静态方法

python中对静态方法也有一个装饰器@staticmethod来进行标识。静态方法也是通过类或者实例来调用的,但是不能直接调用,这有点我们调用模块中方法的感觉。import module1;module1.func();对吧,静态方法‘属于’类,我们通过类找到静态方法,当然类的实例继承了相关的信息,也可以调用静态方法。如下图。结果我不贴上来了,都是一样的。
【PYTHON】类方法、静态方法和实例方法
另外我们想静态方法能不能‘直接’调用类的静态属性呢?试一下。
【PYTHON】类方法、静态方法和实例方法
【PYTHON】类方法、静态方法和实例方法
发现报错了。那我们加nonlocal 或者global 试一下呢?
【PYTHON】类方法、静态方法和实例方法
【PYTHON】类方法、静态方法和实例方法
结果我不贴了,也都报错了。

后面我还做了一些验证,例如使用global的时候,在类的外面定义name = ‘123’,这时没有报错,print的是‘123’。有兴趣可以自己试一下。
所以这个地方,类中的静态属性的变量名应该是类似calculator.name这样,即使是类内部也无法通过name直接访问。

子类继承

这三种方法,子类都可以从父类继承,很好验证,同样图不贴了。

以上。

相关文章:

  • 2021-08-17
  • 2021-09-25
  • 2018-11-27
  • 2018-11-21
  • 2021-09-07
  • 2021-10-20
  • 2021-10-17
  • 2021-08-17
猜你喜欢
  • 2020-06-30
  • 2018-06-30
  • 2021-08-29
  • 2018-09-10
  • 2018-01-14
  • 2018-12-02
  • 2020-04-10
  • 2020-03-23
相关资源
相似解决方案