首页 > 其他分享 >super()函数

super()函数

时间:2024-11-18 16:29:33浏览次数:1  
标签:函数 Parent process self Child 父类 super

super 是 Python 中一个内置的函数,用于调用父类的方法或初始化父类的构造函数。它在类的继承关系中非常有用,尤其在多继承中,可以有效避免直接引用父类导致的复杂性和错误。


基本语法

super([type[, object-or-type]])
  • type: 当前类(可选)。通常在类方法中省略,默认指调用 super() 的类。
  • object-or-type: 当前类的实例(可选)。通常在类方法中省略,默认使用 self

常见用法

1. 调用父类的构造函数

class Parent:
    def __init__(self, name):
        self.name = name
        print(f"Parent initialized with name: {self.name}")

class Child(Parent):
    def __init__(self, name, age):
        # 调用父类构造函数
        super().__init__(name)
        self.age = age
        print(f"Child initialized with age: {self.age}")

child = Child("Alice", 10)

输出:

Parent initialized with name: Alice
Child initialized with age: 10

2. 调用父类的普通方法

class Parent:
    def greet(self):
        print("Hello from Parent")

class Child(Parent):
    def greet(self):
        # 调用父类方法
        super().greet()
        print("Hello from Child")

child = Child()
child.greet()

输出:

Hello from Parent
Hello from Child

3. 在多继承中使用 super

super 遵循 方法解析顺序 (MRO),按照继承关系自动寻找方法调用的顺序,避免重复调用。

class A:
    def process(self):
        print("A process")

class B(A):
    def process(self):
        print("B process")
        super().process()

class C(A):
    def process(self):
        print("C process")
        super().process()

class D(B, C):
    def process(self):
        print("D process")
        super().process()

d = D()
d.process()

输出:

D process
B process
C process
A process

特点与规则

  1. 避免硬编码类名
    使用 super() 的方式更灵活,可自动适配继承链,不需直接调用父类名(例如 Parent.method(self)),减少代码耦合。
  2. 遵循 MRO (Method Resolution Order)
    在多继承中,super 遵循 MRO,确保每个父类的方法只调用一次。
  3. 多继承时避免菱形继承问题
    super 可以正确处理菱形继承结构,避免重复调用。

特殊场景

在类方法中使用

class Parent:
    @classmethod
    def greet(cls):
        print(f"Hello from {cls.__name__}")

class Child(Parent):
    @classmethod
    def greet(cls):
        super().greet()
        print(f"Hello from {cls.__name__}")

Child.greet()

输出:

Hello from Parent
Hello from Child

在静态方法中无法使用 super

静态方法没有绑定实例或类,无法通过 super 调用父类方法。

class Parent:
    @staticmethod
    def greet():
        print("Hello from Parent")

class Child(Parent):
    @staticmethod
    def greet():
        # super().greet()  # 无法使用,会报错
        Parent.greet()  # 静态方法需要直接调用
        print("Hello from Child")

Child.greet()

总结

  • super 用于调用父类的构造函数或其他方法。
  • 在单继承中,super() 让代码更灵活,避免直接引用父类名。
  • 在多继承中,super() 遵循 MRO,避免重复调用父类方法。
  • 常用场景:
    • 初始化父类构造函数。
    • 调用父类中被重写的方法。
    • 多继承时确保方法按正确顺序调用。

标签:函数,Parent,process,self,Child,父类,super
From: https://www.cnblogs.com/pmna/p/18552953

相关文章

  • 什么是 C++ 中的友元函数和友元类?友元的作用是什么?有什么注意事项?
    友元函数(FriendFunction)定义友元函数是在类定义中用关键字friend声明的非成员函数。它可以访问类的私有(private)和保护(protected)成员。作用和使用场景友元函数主要用于在某些情况下,需要在类的外部函数中访问类的私有或保护成员。例如,在操作符重载中,当需要访问类的私有数......
  • startswith()函数
    startswith()函数概述startswith()是Python字符串方法,用于检查字符串是否以指定的前缀开头。常用于字符串匹配或验证操作。语法str.startswith(prefix[,start[,end]])参数:prefix(必需):要匹配的前缀,可以是字符串或元组(包含多个前缀)。start(可选):检查的起始索引(默认......
  • 用函数实现模块化程序设计习题
    写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入//写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入#include<stdio.h>intgetGCD(inta,intb){ intiM......
  • map 和 lambda 函数
    map和lambda的用法及规则1.map函数map是Python内置函数,用于对可迭代对象中的每个元素应用一个函数,并返回一个map对象(可以转换为其他数据类型,如列表、元组等)。语法map(function,iterable,...)参数function:需要应用的函数。iterable:一个或多个可迭代对象。......
  • 目标检测中的损失函数及其改进方案
    目标检测中的损失函数是模型训练的核心部分,它衡量了模型预测与真实标注之间的差异,并通过优化损失函数来指导模型参数的更新。损失函数通常由多个部分组成,包含了不同层面的误差,具体包括位置损失、分类损失和置信度损失,这些损失合起来决定了模型在目标检测任务中的性能。目标......
  • C++ 编程基础(8)模版 | 8.2、函数模版
    文章目录一、函数模版1、声明与定义2、模版参数3、模板的实例化3.1、隐式实例化3.2、显示实例化4、模版的特化5、注意事项6、总结前言:C++函数模板是一种强大的特性,它允许程序员编写与类型无关的代码。通过使用模板,函数或类可以处理不同的数据类型,而无需重复编写......
  • 机器学习笔记——损失函数、代价函数和KL散度
    本笔记介绍机器学习中常见的损失函数和代价函数,各函数的使用场景。损失函数一、回归问题中的损失函数1.均方误差(MeanSquaredError,MSE)定义:描述:MSE衡量的是预测值和真实值之间的平方误差的平均值。对较大的误差会进行更大的惩罚,因此它对异常值(outliers)非常敏感......
  • 【人脸伪造检测】Self-Supervised Video Forensics by Audio-Visual Anomaly Detectio
    一、研究动机[!note]原理:经过处理后的视频在视觉和音频信号之间通常会有不一致的现象,提出一种基于异常检测算法实现视频伪造取证。挑战:不同于简单的检测不同步的例子,因为由于视频采集往往会有“延迟”现象,出现帧偏移现象创新点:提出在视听特征中实现异常检测,该特征包含了视听......
  • 【开窗函数】三个SQL题
             本文主要练习一下lag开窗函数的使用!!!一、第一题 建表语句:createtablem1(dtstring,namestring,deptstring,scoreint);insertintom1values('202101','张三','销售',90),('202101','李四......
  • STM32微控制器GPIO库函数
    STM32微控制器GPIO库函数目录概述GPIO库函数基础HAL库与标准外设库GPIO库函数分类GPIO数学基础电阻分压公式输入电流计算输出驱动能力功率计算RC时间常数GPIO应用实例LED控制按钮输入与中断串行通信PWM信号生成常见问题与解决方法GPIO引脚无法正确读取输入状......