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程序设计有所帮助。