python语法:类中继承,多重继承和重写问题

本文篇幅较长,主要是讨论python中类的继承中方法和属性的问题。如:基础的继承,怎么添加属性和多重继承中属性和方法等。

看完应该可以每天扮演一个稳重的大人了


首先我们先写三个类:

第一个类:定义电话本 第二个类:输出 第三个类:多重继承第一类和第二类

class Contant:
	all=[]
	def __init__(self,name,email):
		self.name=name
		self.email=email
		Contant.all.append(self)

class MailSend:
	def send_mail(self):
		print("send mail to" + self.email)


class ContantMail(Contant,MailSend):
	pass

 

我们实例化一下:

c1=Contant("悟空",'1@.com')
c2=MailSend()
c3=ContantMail("悟饭",'2@.com')

分别测试如下:

1.

print(c2.send_mail()) #调用第二类的方法

肯定会报错,因为c2里面没有email这个属性

 

2.

print(c3.send_mail())#调用第三个类的方法

 

发现并没有报错,而是打印了第一个类中的email属性

我们用pinrt(dir(c3))

可以看到确实有:

'all', 'email', 'name', 'send_mail'的属性活方法!

 

这说明了什么?按照我的理解,当我们以

class ContantMail(Contant,MailSend):
	pass

这样的写法多重继承Contant类和MailSend类时候,其完全组合为一个ContantMail类,可以假象为这种形式:

class ContantMail():
	all=[]
	def __init__(self,name,email):
		self.name=name
		self.email=email
		ContantMail.all.append(self)
	def send_mail(self):
		print("send mail to" + self.email)

c3=ContantMail("悟饭",'2@.com')

print(c3.send_mail())

其输出结果是一模一样的

 


第一部分讲完,但是如果我们重写一下MailSend类,(一三类不变),变为下面的形式

class Contant:
	all=[]
	def __init__(self,name,email):
		self.name=name
		self.email=email
		Contant.all.append(self)

class MailSend:
	def __init__(self,message):
		self.message=message
	
	def send_mail(self):
		print("send {} mail to you".format(self.message))


class ContantMail(Contant,MailSend):
	pass

c1=Contant("悟空",'1@.com')
c2=MailSend("hello")
c3=ContantMail("悟饭",'2@.com')

 

我们可以

print(dir(c3))

可以发现其中有:

'all', 'email', 'name', 'send_mail'!

好的问题又来了!!第二类中定义的message属性呢?

这说明这种形式的多重继承只默认继承了第一个类中的构造函数,第二个类中的构造函数并不继承。

所以理所当然的print(c3.send_mail()),方法也会报错,因为我们根本就没有message这个属性!

 


最简单的办法就是在子类中重写构造函数。

(但是这种类层级的组织问题就超类被多次调用,下面的Contant类和MailSend类就会两次初始化Object类,这种问题比较复杂一点点,以后再谈)

 

class ContantMail(Contant,MailSend):
	def __init__(self,name,email,message):
		Contant.__init__(self,name,email)
		MailSend.__init__(self,message)

打印输出均没问题:

更加科学的方法会在后期写出,未完待续。


 

tips:

继承的最基本写法如下:

class Contact:
    all_contact=[]
    def __init__(self,name,email):
        self.name=name
        self.email=email
        Contact.all_contact.append(self)


#定义供货商
class Supplier(Contact):
    def order1(self,order):
        print("如果这真的是一个订货系统,我们将显示: "  " \t{} order to {}".format(order,self.name))

基本的继承后添加属性写法:

class Contact:
    all_contact=[]
    def __init__(self,name,email):
        self.name=name
        self.email=email
        Contact.all_contact.append(self)


class Friend(Contact):
    def __init__(self,name,email,phone):
        super().__init__(name,email)
        self.phone=phone

c=Friend('lsx','1@qq.com','115')
#实例化对象时直接加参数!!
print(c.phone)

更加深度的文章可以看这个(很硬核了),但是仅仅python作为工具就没必要了:

Python的方法解析顺序(MRO)[转] - morra - 博客园​www.cnblogs.com图标

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值