Python每天3分钟 #047 – 静态方法

欢迎访问Python每天3分钟系列。

每天花3分钟时间,学习或温习一个Python知识点。今天是第047篇:

静态方法

今天是春节7天假期的第5天,也是我本周3分钟系列更新的最后一天。麦友们,你们春节过得怎么样?

今天的更新是对034(Duck Typing 鸭子类型) 的两位麦友问题的回答,这两个问题都是关于静态方法,英文是static method

在034中,我们定义2个类:

class Duck:

 def duck_walk(self):
  print('走🦆步')

 def duck_sound(self):
  print('嘎嘎嘎')

# 全聚德
class QuanJude:

 @staticmethod
 def cook(duck):
  print("-- 鸭子来了,先检查一下 ---")
  # 走走看
  duck.duck_walk()
  # 叫两声听听
  duck.duck_sound()

  print("验证完毕,可以下锅了")

# 搞两只鸭子
d1 = Duck()
d2 = Duck()

# 送到全聚德
QuanJude.cook(d1)
QuanJude.cook(d1)

有两个麦友提问。麦友@超大加肥猫说:

QuanJude类中的这个 @staticmethod 是装饰什么呢?从哪里来呢?

麦友@空白名字说:

静态方法到底是如何实现的呢? 其实就是把实列方法的自动必传self参数的过程省了嘛?QuanJude方法里调用参数的方法?一个方法里封装了鸭子的2个方法…..

一个例子理解三种方法

结合045的知识:类只不过是其中一种代码块,我们可以把类理解成一个范围,这个范围里有全局变量,有很多方法。

具体来说,类中有三种不同类型的方法:

  • 实例方法:它作用在一个具体实例上,所以第一个参数必须是一个类的实例。实例方法通常要访问实例的属性。
  • 类方法:它作用在类上,所以第一个参数必须是类本身。类方法通常需要访问类中的全局变量。
  • 静态方法:它不一定要作用在实例上或者类上,所以它没有强制的参数。

静态方法是最普通的一种方法,它不依赖于实例,也不依赖于类。它之所为被放在类中定义,是因为它和类有一定的关系。可能没有那么直接的关系,但是多少有点关系,所以放在类中是比较合适。

为了区分这三种方法,Python引入了两个装饰器:

  • 默认方法是实例方法,不需要装饰器,第一个参数必须是类实例
  • 类方法使用**@classmethod**装饰器,第一个参数必须是类
  • 静态方法使用**@staticmethod**装饰器,没有特殊参数要求

看这个例子,仔细读注释:

class StudentScore:

    chinese_pass_score = 52 #及格线
    math_pass_score = 52 #及格线
    english_pass_score = 52 #及格线

    # 计算总的及格分数,和单个实例无关,但是和各科及格线有关
    @classmethod
    def total_pass_score(cls):
        return cls.english_pass_score + cls.chinese_pass_score + cls.math_pass_score

    def __init__(self, chinese, math, english):
        self.chinese = chinese
        self.math = math
        self.english = english

    # 计算总成绩,和实例有关
    def total(self):
        return self.chinese + self.math, self.english

    # 计算平均成绩,和实例有关
    def avg(self):
        return total(self)/3

    # 这个静态方法不需要访问实例属性,也不需要访问类的全局变量
    @staticmethod
    def introduction():
        print('这里想不出很好的例子.... 参考全聚德的例子')

回答上面的问题

麦友@超大加肥猫说:

QuanJude类中的这个 @staticmethod 是装饰什么呢?从哪里来呢?

回答:@staticmethod是Python自带的装饰器方法,它告诉Python解释器:这个函数是静态函数,不需要实例或者类作为第一个参数。

麦友@空白名字说:

静态方法到底是如何实现的呢?

回答:静态方法就是个普通的方法。比另外两种都要更普通,只不过碰巧放到类里面而已。

其实就是把实列方法的自动必传self参数的过程省了嘛?

回答:并不是的,静态方法根本不需要传入实例。虽然它有参数duck,但这个参数并不是Quanjude类的实例。

QuanJude方法里调用参数的方法?一个方法里封装了鸭子的2个方法…..

回答:是的。它当然可以调用参数的方法。它调用了两个参数的方法。这也不能算是封装了这2个方法。只是调用了这两个方法。

总结

对于没有接触过面向对象的人,理解这三种方法是有点困难的。如果没读懂,不要气馁,多读几次,或许就会豁然开朗。有问题也可以继续给我留言。

原文链接:http://www.zsiss.com/5638.html,转载请注明出处。

0

评论0

请先

爱分享推出ChatGPT国内镜像,无需魔法直接用!写文章,写代码,做PPT,做网站原创软文效果好到爆炸 https://chat.gcrup.com

社交账号快速登录