super()调用和父类名调用的区别

子类调用父类的两种方法:

bash 复制代码
方法1:
父类名.父类方法名()
# 可以调用多个父类的方法
scss 复制代码
方法2:
super().父类方法名()
# 只能调用第一个父类的方法

为什么不用方法2完全替代方法1

  1. 父类名.父类方法名()不适用于多继承的情况。
多继承 复制代码
方法一:
class A(object):
    def __init__(self):
        print('A初始化')

class B(A):
    def __init__(self):
        A.__init__(self)
        print('B初始化')

class C(A):
    def __init__(self):
        A.__init__(self)
        print('C初始化')

class D(B,C):
    def __init__(self):
        B.__init__(self)
        C.__init__(self)
        print('D初始化')

if __name__ == '__main__':
    d = D()
输出结果 复制代码
输出结果:
A初始化	#第一次调用
B初始化
A初始化	#第二次调用,重复调用
C初始化
D初始化

可以看到A被调用了两次,可能会引发数据重复初始化,资源浪费甚至是错误。

多继承 复制代码
方法二:
class A(object):
    def __init__(self):
        print('A初始化')

class B(A):
    def __init__(self):
        super().__init__()
        print('B初始化')

class C(A):
    def __init__(self):
        super().__init__()
        print('C初始化')

class D(B,C):
    def __init__(self):
        # 自动按 MRO 顺序调用,只调用一次 A.__init__
        super().__init__()
        print('D初始化')

if __name__ == '__main__':
    d = D()
输出结果 复制代码
输出结果:
A初始化
C初始化
B初始化
D初始化

使用super(),A只被初始化了一次,遵循方法解析顺序(MRO)。

  1. 父类名.父类方法名()会导致代码耦合性强,如果父类改名或者继承结构变动,需要手动修改子类调用。

super()是动态的,会根据类的继承关系自动查找父类,无需编码类名。

  1. 父类名.父类方法名()无法支持多协作式继承,即多个类协同完成一个任务。每个类都调用super().method()来传递控制权。
代码 复制代码
多协作式继承:
class PluginA:
    def setup(self):
        print("PluginA 设置")
        super().setup()  # 让下一个类继续设置

class PluginB:
    def setup(self):
        print("PluginB 设置")

class Combined(PluginA, PluginB):
    def setup(self):
        print("Combined 设置")
        super().setup()


c = Combined()
c.setup()

!!!记住:super() 不是"调用父类",而是"调用 MRO 中的下一个类"。如果那个类没有对应方法,就会报错。!!!

相关推荐
喵手28 分钟前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手34 分钟前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
2601_949146531 小时前
Python语音通知接口接入教程:开发者快速集成AI语音API的脚本实现
人工智能·python·语音识别
寻梦csdn1 小时前
pycharm+miniconda兼容问题
ide·python·pycharm·conda
Java面试题总结2 小时前
基于 Java 的 PDF 文本水印实现方案(iText7 示例)
java·python·pdf
不懒不懒2 小时前
【决策树算法实战指南:从原理到Python实现】
python·决策树·id3·c4.5·catr
马猴烧酒.2 小时前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
天空属于哈夫克33 小时前
Java 版:利用外部群 API 实现自动“技术开课”倒计时提醒
数据库·python·mysql
喵手3 小时前
Python爬虫实战:全站 Sitemap 自动发现 - 解析 sitemap.xml → 自动生成抓取队列的工业级实现!
爬虫·python·爬虫实战·零基础python爬虫教学·sitemap·解析sitemap.xml·自动生成抓取队列实现
luoluoal3 小时前
基于深度学习的web端多格式纠错系统(源码+文档)
python·mysql·django·毕业设计·源码