Python实现子类调用父类的初始化实例

作者:feishicheng 时间:2023-09-20 00:25:27 

前言

python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__方法重写了父类的__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。

例如以下的代码:


class A(object):
def __init__(self):
 self.a = 5

def function_a(self):
 print('I am from A, my value is %d' % self.a)

class B(A):
def __init__(self):
 self.b = 10

def function_b(self):
print('I am from B, my value is %d' % self.b)
 self.function_a() # 调用类A的方法,出错

if __name__ == '__main__':
b = B()
b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

这时候就需要在类B的__init__方法中先执行类A的__init__方法,脚本才可以正确执行。Python提供了两种方法来完成这个任务。

方法一: 调用未绑定的父类__init__方法

在类的方法定义时,首个参数均为self。当实例化这个类时,self就被自动绑定到当前的实例。绑定也就意味着这个实例的属性,方法都可以通过‘self.***的方式进行调用。但是如果通过类名直接调用类的方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定的实例上。也就是子类的实例上,在这里就是类B了。

所以这里所说的未绑定的父类__init__方法 就是指未绑定父类实例的父类__init__方法。

具体的代码如下:


class A(object):
def __init__(self):
 self.a = 5

def function_a(self):
 print('I am from A, my value is %d' % self.a)

class B(A):
def __init__(self):
 A.__init__(self) # 此处修改了。如果类A的__init__方法需要传参,也需要传入对应的参数
 self.b = 10

def function_b(self):
 print('I am from B, my value is %d' % self.b)
 self.function_a()

if __name__ == '__main__':
b = B()
b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

方法二:调用super函数

super函数是用于调用父类的一个方法,主要是用于解决多继承问题,避免多继承带来的一些问题,当然也可以用来解决单继承问题,调用父类的__init__方法了。

具体代码如下:


class A(object):
def __init__(self):
 self.a = 5

def function_a(self):
 print('I am from A, my value is %d' % self.a)

class B(A):
def __init__(self):
 super(B, self).__init__() # 此处修改了
 self.b = 10

def function_b(self):
 print('I am from B, my value is %d' % self.b)
 self.function_a()

if __name__ == '__main__':
b = B()
b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

总结

两种方法各有优缺点,但都可以解决问题。

- 方法一简单直观,但面对多继承问题,只能多次调用每个父类的__init__方法

- 方法二不太直观,但可以解决多继承问题,会一次性的执行所有的父类的对应方法

所以实际使用时,按照自己的需要选择一个就行了。

来源:https://blog.csdn.net/feishicheng/article/details/79596000

标签:Python,子类,父类,初始化
0
投稿

猜你喜欢

  • 基于Python制作一款屏幕颜色提取器

    2023-11-16 05:20:48
  • MySql 备忘录

    2024-01-22 12:56:48
  • 使用Dreamweaver代码片断提高css开发效率

    2007-10-28 15:46:00
  • sql如何实现复合查询?

    2010-05-19 21:25:00
  • 某年第一周开始日期sql实现方法

    2012-02-25 20:02:30
  • 浅析Python编写函数装饰器

    2023-06-07 12:20:05
  • Python3 requests模块如何模仿浏览器及代理

    2023-04-05 06:50:44
  • wxPython中wx.gird.Gird添加按钮的实现

    2021-07-05 15:13:19
  • python实现微信自动回复机器人功能

    2023-12-30 01:01:40
  • Elasticsearch之倒排索引及索引操作

    2023-10-28 00:38:38
  • Python处理文本换行符实例代码

    2021-08-19 18:31:51
  • Python中用Spark模块的使用教程

    2021-10-02 13:11:40
  • SQL Server 数据库索引其索引的小技巧

    2024-01-21 03:13:40
  • Python 打印自己设计的字体的实例讲解

    2021-04-24 14:45:21
  • Mysql实现简易版搜索引擎的示例代码

    2024-01-28 10:42:32
  • numpy之多维数组的创建全过程

    2023-06-22 03:58:03
  • MSSQL Server 查询优化方法 整理

    2024-01-18 02:54:09
  • sql server中批量插入与更新两种解决方案分享(存储过程)

    2012-05-22 18:29:59
  • 必须会的SQL语句(四) 数据删除和更新

    2024-01-29 02:11:51
  • 分享15 超级好用得 Python 实用技巧

    2023-03-01 06:42:09
  • asp之家 网络编程 m.aspxhome.com