Python中子类__init__函数注意项小结

news/2025/2/19 3:09:35/

1. 引言

许多同学在开始学习Python中的面向对象编程时,对于子类的构造函数的初始化操作,经常会感到些许困惑,这里我来试图让它不那么令人困扰。
闲话少说,我们直接开始吧!

2. 准备工作

在面向对象编程中,为了实现多态,他们经常需要使用继承的思想。对于父类和子类,我们必须非常清楚__init___()函数的作用。
本文重点考虑一下三种情况:
首先是父类和子类参数量相同的情况,如下:

# parent & child takes in the SAME number of args# Animal(name, age)              # parent class
# Dog(name, age)                 # child class

接着是子类参数量多于父类的情况,如下:

# child takes in MORE args than parent# Employee(name, age)            # parent class
# Executive(name, age, rank)     # child class

最后是子类参数量少于父类的情形,如下:

# child takes in FEWER args than parent# Rectangle(length, width)       # parent class
# Square(length)                 # child class

3. 情形一:子类父类参数量一致

我们对上述父类Animal(name, age) 和 子类Dog(name, age) , 进行简单定义实现。
首先是父类Amimal

# parent class
class Animal:def __init__(self, name, age):self.name = nameself.age = age

接着是子类Dog

# child class
class Dog(Animal):# Dog's __init__ should follow Dog(name, age)def __init__(self, name, age):# super().__init__ here refers to Animal.__init__super().__init__(name, age)

由于我们的子类Dog继承自父类Animal, 所以当我们运行子类Dog中的__init__函数时:

  • super()指的是Dog的父类Amimal
  • super().__init__() 指的是父类Animal中的__init__函数
  • super().__init__()运行时,实质上是Animal__init__函数在运行,即执行语句self.name=name 以及self.age=age

由于父类Animal和子类Dog的初始化参数都是(name,age) , 所以我们不需要修改子类Dog__init__函数,我们只需要在子类Dog中简单地使用父类的__init__方法即可。

4. 情形二:子类参数量比父类参数量多

我们对上述父类Employee(name, age) 和 子类Executive(name, age, rank) , 进行简单定义实现。
首先是父类Employee

# parent class
class Employee:def __init__(self, name, age):self.name = nameself.age = age

接着是子类Executive的定义:

# child class
class Executive(Employee):# Executive.__init__ follows Executive(name, age, rank)def __init__(self, name, age, rank):# super().__init__ refers to Employee.__init__# super().__init__ should follow Employee(name, age)super().__init__(name, age)# super().__init__() does not set rank, so we must do it manuallyself.rank = rank

同上,当我们在子类Executive调用super().__init__()时,我们实质上运行的是父类Employee中的self.name = nameself.age = age 。同时由于父类Employee中并没有初始化参数rank , 因此我们需要在子类Executive中手动指定改参数的初始化。

简而言之,我们在子类Executive中调用 super().__init__(name, age) self.rank = rank,实质上等价于执行如下语句self.name = name ,self.age = age以及self.rank = rank.

5. 情形三:子类参数量比父类参数量少

我们对上述父类Rectangle(length, width) 和 子类Square(length) , 进行简单定义实现。

首先是父类Rectangle的定义:

# parent class
class Rectangle:def __init__(self, length, width):self.length = lengthself.width = width

接着是子类Square的定义:

# chid class
class Square(Rectangle):# Square.__init__ should follow Square(length)def __init__(self, length):# super().__init__ should follow Rectangle()super().__init__(length, length)

我们知道,在子类正方形中默认length=width,所以我们对该类的__init__函数只需要传入一个参数length即可。同样的当我们在子类Square中调用super().__init()函数时,我们调用的是父类Rectangle中的__init__函数。

通过将参数length传递给子类,并调用父类的初始化函数,实质上(length,length)通过Square传递时,实质上等效于self.length = lengthself.width = length,这和我们的常识正方形中长度和宽度相等是保持一致的。

6. 总结

本文重点介绍了使用Python进行面向对象编程时,父类和子类初始化函数构造时的三种情形下的差异点,可以帮助大家更加深入的理解多态的实现。

嗯嗯,您学废了嘛?


http://www.ppmy.cn/news/47995.html

相关文章

《LeetCode》——LeetCode刷题日记

本期,将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 (一)606. 根据二叉树创建字符串 💥题意分析 💥解题思路 (二)102. 二叉树的层序遍历 💥题意分析 &#…

scratch足球射门练习 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch足球射门练习 一、题目要求 1、准备工作 2、功能实现 二、案例分析

命令行语法格式

在学习一些Linux命令、执行脚本命令、安装执行程序的命令时&#xff0c;官方往往会提供一些命令行参数相关的说明。虽然不同系统会有一些差别&#xff0c;但这些说明通常是有约定俗成的写法的。 一般格式如下&#xff1a; 命令 <必选参数1|必选参数2> [-option {必选参…

node版本管理nvm的使用

在很多情况下对node版本需要安装多版本的控制&#xff0c;如何快速的切换node版本&#xff0c;请在配置完node的环境变量的基础上&#xff0c;阅读这篇文章。这里需要介绍nvm这个工具&#xff1a; 一、下载 官方下载地址&#xff1a;https://github.com/coreybutler/nvm-wind…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

煤矿电子封条视频监控系统 yolov7

煤矿电子封条视频监控系统基于yolov7python网络模型视频AI智能分析技术&#xff0c;煤矿电子封条视频监控算法模型对现场皮带撕裂、跑偏、皮带异物、堆煤等设备异常状态实时监控分析自动识别预警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队希望它能…

【网络小知识】TCP协议介绍/三次握手,四次挥手的作用

前端开发人员需要了解三次握手和四次挥手的原因是&#xff0c;这些概念是在客户端和服务器端之间进行网络通信时所涉及到的 TCP 协议的基本知识。而对于前端来讲&#xff0c;如果页面中请求服务端数据时出现连接失败、延迟等问题&#xff0c;就需要对TCP协议中三次握手、四次挥…

蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解

赛题介绍 挑战介绍 列置换加密是明文以每行固定字数&#xff08;key 的字母种类数&#xff0c;一般情况下 key 会选择字母不重复的单词&#xff09;一行一行写下&#xff0c;如果最后一行字数小于每行的固定字数&#xff0c;则使用特殊符号补充&#xff0c;这样就形成了一个矩…