彻底明白Python中Super()使用小结

 更新时间:2026年02月12日 09:32:11   作者:AbsoluteLogic  
本文主要介绍了彻底明白Python中Super()使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是Super()

如果把类比作表演者的话,Super()则是按照清单(MRO)让下一位表演者“继续”他的表演

没听明白没关系,我们通过实际的例子来逐步拆解Super()的运行逻辑,到时候我们就能明白这句话的含义

为什么要用Super()

和拆解Property一样,我们在拆解Super()前也要知道我们为什么要用它

我们同样通过实际的代码示例来理解

class BasicOrder:
    def __init__(self, price):
        self.price = price
    
    def get_total(self):
        return self.price
        # 返回基础价格
class MemberOrder(BasicOrder):
    def get_total(self):
        return self.price * 0.9
        # 返回会员折后价
        
class PromotionOrder(BasicOrder):
    def get_total(self):
        if self.price > 200:
            return self.price - 20
            # 满减条件
        else:
            return self.price
        
a = BasicOrder(300)
print(a.get_total())
# 原价
b = MemberOrder(300)
print(b.get_total())
# 会员折后价
c = PromotionOrder(300)
print(c.get_total())
# 满减价格

我们定义了两种折扣机制,一种是会员价,一种是满减。我们可以根据不同的折扣方式,算出打折后的价格

但是,有一种情况我们并没有考虑,那就是两种折扣同时触发的情况。如果我们规定,当两个折扣方式同时满足时,先计算会员折后价,再考虑满减,我们该如何修改这段代码呢?

很简单,我们再定义一个类,就像这样

class BasicOrder:
    def __init__(self, price):
        self.price = price

    def get_total(self):
        return self.price
        # 返回基础价格


class MemberOrder(BasicOrder):
    def get_total(self):
        return self.price * 0.9
        # 返回会员折后价


class PromotionOrder(BasicOrder):
    def get_total(self):
        if self.price > 200:
            return self.price - 20
        else:
            return self.price
        # 触发满减

class FinalOrder(MemberOrder):
    def get_total(self):
        member_price = MemberOrder.get_total(self)
        if member_price > 200:
            return member_price - 20
        else:
            return member_price
        
a = BasicOrder(300)
print(a.get_total())
# 原价
b = MemberOrder(300)
print(b.get_total())
# 会员折后价
c = PromotionOrder(300)
print(c.get_total())
# 满减价格
d = FinalOrder(300)
print(d.get_total())
# 双重折扣后的价格

如果要更换折扣顺序,先计算满减,再计算会员价,只要对FinalOrder进行修改就好

class FinalOrder(PromotionOrder):
    def get_total(self):
        count_price = PromotionOrder.get_total(self)
        return count_price * 0.9

我们这种修改,在类的数量也就是折扣方式比较少时没什么问题。但如果类的数量比较多,我们就要想办法,如何不用进行这么复杂的修改。这就是我们使用super()的原因

Super()的作用

我们用super()对上面的代码进行优化

class BasicOrder:
    def __init__(self, price):
        self.price = price

    def get_total(self):
        return self.price
        # 返回基础价格


class MemberOrder(BasicOrder):
    def get_total(self):
        return super().get_total() * 0.9
        # 返回会员折后价


class PromotionOrder(BasicOrder):
    def get_total(self):
        if super().self.price > 200:
            return super().get_total() - 20
        else:
            return super().get_total()
        # 触发满减

class FinalOrder(MemberOrder, PromotionOrder):
    def get_total(self):
        return super().get_total()
        
a = BasicOrder(300)
print(a.get_total())
# 原价
b = MemberOrder(300)
print(b.get_total())
# 会员折后价
c = PromotionOrder(300)
print(c.get_total())
# 满减价格
d = FinalOrder(300)
print(d.get_total())
# 双重折扣后的价格
print(FinalOrder.mro())
# 打印Mro清单

我们要注意最后的Mro清单,它的输出结果是[<class '__main__.FinalOrder'>, <class '__main__.MemberOrder'>, <class '__main__.PromotionOrder'>, <class '__main__.BasicOrder'>, <class 'object'>]。这也就是当我们计算FinalOrder中的最后价格时,程序的执行顺序

python按照这个顺序,先从FinalOrder-MemberOrder-PromotionOrder-BasicOrder这个链条进行递进寻找,然后再从反方向BasicOrder-PromotionOrder-MemberOrder-FinalOrder进行回归计算

上面的代码就是按照这个顺序,先把原价BasicOrder给PromotionOrder计算满减,再将满减后的值给MemberOrder计算会员折扣价,最后把值给FinalOrder

return super().get_total()其实就可以理解为请MRO链条上的下一位先算出结果给我

如果我们需要改变折扣计算的方式,我们也无须对FinalOrder中的内容进行修改,只需要修改继承顺序,也就是对这个“链条”进行调整就好

当我们修改某些类名时,我们也不用像之前的“硬编码”那样逐个修改,只要确保继承的类名正确,super()会自己按照MRO这个链条进行寻找

class FinalOrder(PromotionOrder, MemberOrder):
    def get_total(self):
        return super().get_total()

结语

到此这篇关于彻底明白Python中Super()使用小结的文章就介绍到这了,更多相关Python Super() 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Python中执行和调用JavaScript的多种方法小结

    在Python中执行和调用JavaScript的多种方法小结

    JavaScript(JS)是一种常用的脚本语言,通常用于网页开发,但有时也需要在Python中执行或调用JavaScript代码,本文将详细介绍Python中执行和调用JavaScript的多种方法,每种方法都将附有示例代码,方便理解如何在Python中与JavaScript进行互动,需要的朋友可以参考下
    2023-11-11
  • 深入理解 python 虚拟机

    深入理解 python 虚拟机

    这篇文章主要介绍了深入理解 python 虚拟机的相关资料,需要的朋友可以参考下
    2023-04-04
  • 利用python清除移动硬盘中的临时文件

    利用python清除移动硬盘中的临时文件

    本篇文章的目的是在移动硬盘插入到电脑的同时,利用Python自动化和Windows服务删除掉这些临时文件。感兴趣的朋友可以了解下
    2020-10-10
  • 分享一个可以生成各种进制格式IP的小工具实例代码

    分享一个可以生成各种进制格式IP的小工具实例代码

    这篇文章主要给大家分享了一个可以生成各种进制格式IP的小工具,利用的语言是python实现的一个小工具,这个小工具对大家的日常使用与开发具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。
    2017-07-07
  • Pycharm使用时会出现的问题之cv2无法安装解决

    Pycharm使用时会出现的问题之cv2无法安装解决

    这篇文章主要介绍了Pycharm使用时会出现的问题之cv2无法安装解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Python+PyQt5实现美剧爬虫可视工具的方法

    Python+PyQt5实现美剧爬虫可视工具的方法

    这篇文章主要介绍了Python+PyQt5实现美剧爬虫可视工具的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python中的xmltodict模块详解

    Python中的xmltodict模块详解

    这篇文章主要介绍了Python中的xmltodict模块详解,xmltodict一般我们用 json、yaml 转换成 dict 可能多一些,xml 转到 dict 可能用得不多,不过,还是可以来看一看,需要的朋友可以参考下
    2023-07-07
  • PyQt5编程扩展之资源文件的使用教程

    PyQt5编程扩展之资源文件的使用教程

    PyQt5支持Qt的资源系统,这是用于在应用程序中嵌入图片和翻译文件等资源的工具,下面这篇文章主要给大家介绍了关于PyQt5编程扩展之资源文件使用的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Python两个内置函数 locals 和globals(学习笔记)

    Python两个内置函数 locals 和globals(学习笔记)

    这篇文章主要介绍了Python两个内置函数 locals 和globals(学习笔记),需要的朋友可以参考下
    2016-08-08
  • linux查找当前python解释器的位置方法

    linux查找当前python解释器的位置方法

    今天小编就为大家分享一篇linux查找当前python解释器的位置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02

最新评论