Python面向对象类的继承实例详解
本文实例讲述了Python面向对象类的继承。分享给大家供大家参考,具体如下:
一、概述
面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些OOP语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力。
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee是一个人,Manager也是一个人,因此这两个类都可以继承Person类。但是Leg类却不能继承Person类,因为腿并不是一个人。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成)→用类与实例进行设计和实现几个阶段。
二、类的继承
2.1继承的定义
classPerson(object):#定义一个父类 deftalk(self):#父类中的方法 print("personistalking....") classChinese(Person):#定义一个子类,继承Person类 defwalk(self):#在子类中定义其自身的方法 print('iswalking...') c=Chinese() c.talk()#调用继承的Person类的方法 c.walk()#调用本身的方法
输出:
personistalking....
iswalking...
2.2构造函数的继承
如果我们要给实例c传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?
继承类的构造方法:
1.经典类的写法:父类名称.__init__(self,参数1,参数2,...)
2.新式类的写法:super(子类,self).__init__(参数1,参数2,....)
classPerson(object): def__init__(self,name,age): self.name=name self.age=age self.weight='weight' deftalk(self): print("personistalking....") classChinese(Person): def__init__(self,name,age,language):#先继承,在重构 Person.__init__(self,name,age)#继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age) self.language=language#定义类的本身属性 defwalk(self): print('iswalking...') classAmerican(Person): pass c=Chinese('bigberg',22,'Chinese')
如果我们只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。
子类构造函数基础父类构造函数过程如下:
实例化对象c---->c调用子类__init__() ---->子类__init__()继承父类__init__() ----->调用父类__init__()
2.3子类对父类方法的重写
如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法
classPerson(object): def__init__(self,name,age): self.name=name self.age=age self.weight='weight' deftalk(self): print("personistalking....") classChinese(Person): def__init__(self,name,age,language): Person.__init__(self,name,age) self.language=language print(self.name,self.age,self.weight,self.language) deftalk(self):#子类重构方法 print('%sisspeakingchinese'%self.name) defwalk(self): print('iswalking...') c=Chinese('bigberg',22,'Chinese') c.talk()
输出:
bigberg22weightChinese
bigbergisspeakingchinese
三、类继承的事例
classSchoolMember(object): '''学习成员基类''' member=0 def__init__(self,name,age,sex): self.name=name self.age=age self.sex=sex self.enroll() defenroll(self): '注册' print('justenrolledanewschoolmember[%s].'%self.name) SchoolMember.member+=1 deftell(self): print('----%s----'%self.name) fork,vinself.__dict__.items(): print(k,v) print('----end-----') def__del__(self): print('开除了[%s]'%self.name) SchoolMember.member-=1 classTeacher(SchoolMember): '教师' def__init__(self,name,age,sex,salary,course): SchoolMember.__init__(self,name,age,sex) self.salary=salary self.course=course defteaching(self): print('Teacher[%s]isteaching[%s]'%(self.name,self.course)) classStudent(SchoolMember): '学生' def__init__(self,name,age,sex,course,tuition): SchoolMember.__init__(self,name,age,sex) self.course=course self.tuition=tuition self.amount=0 defpay_tuition(self,amount): print('student[%s]hasjustpaied[%s]'%(self.name,amount)) self.amount+=amount t1=Teacher('Wusir',28,'M',3000,'python') t1.tell() s1=Student('haitao',38,'M','python',30000) s1.tell() s2=Student('lichuang',12,'M','python',11000) print(SchoolMember.member) dels2 print(SchoolMember.member)
输出:
----end-----
justenrolledanewschoolmember[haitao].
----haitao----
age38
sexM
namehaitao
amount0
coursepython
tuition30000
----end-----
justenrolledanewschoolmember[lichuang].
3
开除了[lichuang]
2
开除了[Wusir]
开除了[haitao]
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。