百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

三十三、Python多重继承使用super关键字调用父类构造方法

off999 2024-11-09 12:54 29 浏览 0 评论

1.问题探查

在Python中,子类会通过继承得到父类的构造方法,如果子类有多个直接父类,那么排在前面的类的构造方法会被优先使用。

比如:

class Staff:
    def __init__(self, name, age, job, salary):
        self.name = name
        self.age = age
        self.job = job
        self.salary = salary

    def work(self):
        print(f'{self.name}正在工作, 工作内容是{self.job}, 工资是{self.salary}')


class Customer:
    def __init__(self, name, hobby, location):
        self.name = name
        self.hobby = hobby
        self.location = location

    def visit(self):
        print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')

class Manager(Staff, Customer):
    pass


# 实例化Manager类生成对象
m = Manager('风清扬',50,'打野升级',50000)

# 调用父类方法work()
m.work() # 输出:
# 调用父类方法visit()
m.visit()

执行上面代码,结果是:

风清扬正在工作, 工作内容是打野升级, 工资是50000
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
 in 
     29 m.work() # 输出:
     30 # 调用父类方法visit()
---> 31 m.visit()

 in visit(self)
     17 
     18     def visit(self):
---> 19         print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')
     20 
     21 class Manager(Staff, Customer):

AttributeError: 'Manager' object has no attribute 'hobby'

从上面代码可以知道,Manager类直接继承了两个父类Staff和Customer, 从多继承的原理看,Manager类会优先继承Staff类的构造方法,所以程序使用类Staff的构造参数来实例化m, 会初始化name, age, job, 和salary实例变量,因此在调用m.work()方法时没有问题,得到了正确的结果。

但是,当调用m.visit()方法时,由于使用的是Staff的构造方法,程序并未初始化Customer的两个实例变量hobby和location, 因此会报错。

2.解决方案

为了能解决子类Manager能同时初始化两个直接父类中的实例变量,Manager类应当自己定义自己的构造方法,根据Python的要求,如果子类重写了父类的构造方法,那么子类的构造方法必须调用父类的构造方法。

子类调用父类的构造方法通常有两种实现方式:

  • 使用未绑定方法,因这__init__构造方法也是实例方法,可以这样调用。比如:Customer.__init__(self, name, hobby, location)
  • 使用super()函数调用父类构造方法。比如:super().__init__(name, hobby, location)

代码实现

class Staff:
    def __init__(self, name, age, job, salary):
        self.name = name
        self.age = age
        self.job = job
        self.salary = salary

    def work(self):
        print(f'{self.name}正在工作, 工作内容是{self.job}, 工资是{self.salary}')


class Customer:
    def __init__(self, name, hobby, location):
        self.name = name
        self.hobby = hobby
        self.location = location

    def visit(self):
        print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')

class Manager(Staff, Customer):
    # 重写父类构造方法
    def __init__(self, name, age, job, salary, hobby, location):
        print('<<<<<<<<<<<<<Manager的构造方法>>>>>>>>>>>')
        # 通过super()函数调用父类的构造方法
        super().__init__(name,age,job,salary)  # 也可以这样写 super(Manager, self).__init__(name, age, job, salary)
        # 使用未绑定方式调用Customer父类的构造方法
        Customer.__init__(self,name, hobby, location)


# 实例化Manager类生成对象
m = Manager('风清扬',50,'打野升级',50000,'找令狐冲','华山')

# 调用父类方法work()
m.work() # 输出:
# 调用父类方法visit()
m.visit()

下篇文章将介绍Python面向对象三大特征之多态

相关推荐

conservative(conservative翻译)

conservative是贬义词。作形容词使用意思是保守的;守旧的;(英国)保守党的;低于实际数量的;作名词使用意思是(英国)保守党党员,保守党支持者;保守者;因循守旧者;例句Atleast50...

什么杀毒软件安全可靠(什么杀毒软件安全可靠性高)

肯定是360啊,虽然金山是老牌的杀毒软件公司,但是我觉得金山的体验做得确实一般,收费的时候市场份额很大,但是被360免费之后,360找到自己免费的盈利方式,一直更新迭代功能,不断的加强完善,技术投入力...

中国联通宽带办理(联通宽带办理)

1、首先,请大家打开中国联通官方网站,然后登陆属于自己的账号,可以使用手机号码登录也可以自己注册一个账号登录。2、登陆账号成功以后,点击网页中的“宽带受理”栏目,然后点击进入宽带受理栏目进行在线预约安...

吾爱破解网(吾爱破解网传奇辅助)

你说的这个论坛。我虽然没有注册过,但是我告诉你一般情况下,各大论坛在五一,十一,春节期间会发放邀请码~~~另外,你学习破解也不一定非要到这个破解论坛,很多的黑客论坛有破解板块。这个论坛,本来就是不好...

小游戏网页版秒玩(网页版游戏推荐)

云游戏可以玩电脑游戏。云电脑(Cloudcomputer)是一种智能终端产品,包括云端资源、传输协议和云终端等,并具有集中管控与维护、应用访问、整体资源调度、弹性资源扩展、数据安全等特色特点。云电脑...

转mp4格式在线(在线转码mp4转mp3)
  • 转mp4格式在线(在线转码mp4转mp3)
  • 转mp4格式在线(在线转码mp4转mp3)
  • 转mp4格式在线(在线转码mp4转mp3)
  • 转mp4格式在线(在线转码mp4转mp3)
qq管家官方下载官网(qq管家官方网站)

腾讯电脑管家(TencentPCManager/原名QQ电脑管家)是腾讯公司推出的免费安全软件。拥有云查杀木马,系统加速,漏洞修复,实时防护,网速保护,电脑诊所,健康小助手,桌面整理,文档保护等功...

photoshop最新软件版本(ps最新版本是)

你好,AdobePhotoshop的最新版本是PhotoshopCC2020。新版本的Photoshop具有更多的功能和改进,包括云同步,自动对象选择,增强的画笔和填充工具等。此外,新的Phot...

扫图识别图片在线(扫图识别app下载)
扫图识别图片在线(扫图识别app下载)

1、首先打开手机相册,然后选择你需要识别的图片;2、长按图片,在应用选择中选择“提取文字”;3、对于通过扫一扫识别图片后所得到的文字内容,我们可以进行分享或保存到便签中进行修改编辑,还可以转换到其它文档中进行处理。拓展资料:二维码是近年来在...

2026-01-17 16:03 off999

qq免费申请注册账号(官方免费申请qq号注册账号)
  • qq免费申请注册账号(官方免费申请qq号注册账号)
  • qq免费申请注册账号(官方免费申请qq号注册账号)
  • qq免费申请注册账号(官方免费申请qq号注册账号)
  • qq免费申请注册账号(官方免费申请qq号注册账号)
活跃气氛的10个小游戏(活跃气氛的10个小游戏简单)

我推荐手指儿歌律动小游戏,因为手指儿歌的话,会活动小朋友们的手指,手指活动完之后,我们就可以进行下一步的一些事情1、大合唱:准备一些歌曲,大家将歌词印在白板上,每人叫出句子,所有人一起唱歌,激发出非常...

全能播放器(EV 全能播放器)

在选择全能播放器时,可以考虑以下几个因素:格式支持、功能丰富、界面友好、播放流畅、兼容性强。目前市面上有许多优秀的全能播放器可供选择,如VLC媒体播放器、PotPlayer、KMPlayer等。它们都...

和平精英免费挂 锁头 透视(和平精英挂透视,锁头,自瞄)

apm的意思有很多种。apm在游戏中是指每分钟操作次数,也叫手速;APM也可以是AutomatedPeopleMoverSystem的缩写,意思是旅客自动捷运系统;APM还可能是Advanced...

爱思助手app下载安装(爱思助手下载 安装安卓)

不能在手机端直接下载,需要先下载PC端。安装步骤如下:第1步,安装爱思助手PC端用电脑访问爱思助手官网在产品中心下载并安装“爱思助手PC端V7版”第2步,安装爱思助手移动端打开爱思助手PC端用数据线连...

手机电视直播在线直播(免费观看电视在线高清直播)

1、准备一个U盘,在电脑上下载电视直播软件的安装包(apk格式的,如泰捷视频、电视猫、电视家等软件),复制并存储到U盘的根目录下;2、将U盘插入电视机的USB接口;3、启动电视机,进入智能电视主界面;...

取消回复欢迎 发表评论: