本文篇幅较长,主要是讨论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作为工具就没必要了: