python 类中内存不回收问题_python语法:类中继承,多重继承和重写问题

bf6f4e3f4a4265afd2323344b57b18f9.png

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

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

4bd89d2ac9cfb78ef321d3b9e4a869c7.png

首先我们先写三个类:

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

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这个属性

22d690b4655189d3726955fa2f725429.png

2.

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

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

2f40c2f9fdabec014ff5be4081c5e925.png

我们用pinrt(dir(c3))

577751c9be695a1027f7afc1db9e7818.png

可以看到确实有:

'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))

可以发现其中有:

dfdb1fdd5611ca8db47a694fa0c27b9f.png

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

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

e2646720ceb802a9e3c97c0884d1027a.png

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

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

3dc9456672cac50bf021d512376bd3bc.png

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

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

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

打印输出均没问题:

b85df45b9cb0acd9b626e93a22187d4a.png

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


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
0bbafe7a861790aa9ca3dc6999c33e1d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值