Python构造函数的继承

简介: 在继承中,子类会自动获得一份父类的所有属性和方法,同时还可以定义自己的属性和方法。

在继承中,子类会自动获得一份父类的所有属性和方法,同时还可以定义自己的属性和方法。


对于构造函数的定义会有以下几种情况:


1、父类有构造函数,子类没有


class Base:
    def __init__(self, name, age):
        self.m_Name = name
        self.m_Age = 10
        self.m_Address = 'China'
        pass
    def PrintName(self):
        print('My name is ' + self.m_Name)
    pass
class Derived(Base):
    pass
derived = Derived()

改代码运行会出现错误:

image.png

由错误提示可看出,需要有两个实参传给__init__()函数,而子类中并没有定义,说明子类继承了父类的构造函数。

更改之后代码如下:

class Base:
    def __init__(self, name, age):
        self.m_Name = name
        self.m_Age = 10
        self.m_Address = 'China'
        pass
    def PrintName(self):
        print('My name is ' + self.m_Name)
    pass
class Derived(Base):
    pass
derived = Derived('Foer Kent', 18)
print(derived.m_Age)
derived.PrintName()

执行结果为:

image.png

此时说明,子类已经通过继承下来的构造函数,对继承下来的属性进行赋值,方法也可执行。


2、父类中有构造函数,子类中也有,但是没有使用super()函数


class Base:
    def __init__(self, name, age):
        self.m_Name = name
        self.m_Age = 10
        self.m_Address = 'China'
        pass
    def PrintName(self):
        print('My name is ' + self.m_Name)
    pass
class Derived(Base):
    def __init__(self, name, age):
        pass
    pass
derived = Derived('Foer Kent', 18)
print(derived.m_Age)
derived.PrintName()

会出现错误:

image.png

由错误提示可见,此时子类中并没继承父类中的实例属性,是因为当子类定义了构造函数时,相当于重写了父类中的方法,此时相当于在父类中与子类重名的方法没有被继承,而m_Age几个属性是在父类构造函数中定义的实例属性,没有调用父类构造函数自然就不会有这几个属性,就不会被继承下来。但如果是父类中的类属性,会被继承下来,具体操作不在演示,读者可自行尝试。

所以连后面的print方法也不会执行,因为就没有m_Name这个属性。

注意:Python中多态的重写方法问题,重写的方法只要方法名相同,参数列表中个数不同,也相当于发生了重写,如果想调用父类中的方法,而不是子类中的方法,将用到以下要讲的super()函数。

多态可参照https://blog.csdn.net/Falcont/article/details/115695910

属性分类可参照https://blog.csdn.net/Falcont/article/details/115696093


3、父类中有构造函数,子类中有,且通过super()函数进行关联


class Base:
    def __init__(self, name, age):
        self.m_Name = name
        self.m_Age = 10
        self.m_Address = 'China'
        pass
    def PrintName(self):
        print('My name is ' + self.m_Name)
    pass
class Derived(Base):
    def __init__(self, name, age):
        super(Derived, self).__init__(name, age)
        pass
    pass
derived = Derived('Foer Kent', 18)
print(derived.m_Age)
derived.PrintName()

super(子类名,self).init(value1,value2),此处参数列表不需要self,只需要与父类中除self之外的相同即可。super后面的()中参数可以不写。即直接super().init(父类中构造函数除了self以外的形参)

此时将显示:

image.png

super()函数使得Python调用的是父类的构造函数,而不是子类的。

目录
相关文章
|
3天前
|
存储 缓存 算法
Python中的hash函数
Python中的hash函数
|
6天前
|
Python
Python学习笔记---函数
这篇文章是一份Python函数学习的笔记,涵盖了使用函数的优势、内置函数的调用、自定义函数的定义、函数参数的不同类型(必须参数、关键字参数、默认参数、可变参数)、有返回值和无返回值的函数、形参和实参、变量作用域、返回函数、递归函数、匿名函数、偏函数以及输入和输出函数等多个函数相关的主题。
|
6天前
|
算法 Python
python多继承的3C算法是什么?怎么用?
有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法
|
16天前
|
存储 Serverless 数据处理
Python - len(string)函数
通过上述介绍和示例,我们可以清楚地看到,在Python中,`len()`函数是处理字符串以及其他可迭代对象长度的重要工具。它简单、易用,但在实际应用中却非常强大,无论是在基础编程还是在复杂的数据处理中,`len()`函数都扮演着不可或缺的角色。
35 10
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
13 4
|
15天前
|
Python
【Python】实现MATLAB中计算两个矩形相交面积的rectint函数
Python中实现MATLAB中rectint函数的方法,该函数用于计算两个矩形相交区域的面积,并通过定义Rectangle类和calc_area函数展示了如何计算两个矩形的交集面积。
11 1
|
19天前
|
IDE API 开发工具
|
25天前
|
Python
python中定义函数时使用位置参数
【7月更文挑战第25天】
28 7
|
22天前
|
开发者 Python
Python函数与模块使用方法
【7月更文挑战第24天】Python 是一种功能强大的编程语言,拥有丰富的函数和模块,使得开发者能够轻松地构建复杂的应用程序。本文将介绍 Python 中函数和模块的基本使用方法,并提供一些代码实例。
25 3
|
24天前
|
Python
Python - ljust(width[, fillchar])函数
综上所述,`ljust()` 方法是Python中处理文本对齐的重要工具之一,特别是在需要将输出结果格式化为列状数据时。通过合理地利用这一方法,可以大大增强程序的可读性和专业度。
29 4