python语言继承_Python 继承

本文详细介绍了Python中类的继承机制,包括基本概念、继承方式(实现继承与接口继承)、继承示例及实战案例,帮助读者理解如何在Python中有效利用继承特性。

Python 继承

类的继承(一)

继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

继承的过程,就是从一般到特殊的过程。

要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

继承概念的实现方式主要有2类:实现继承、接口继承。

Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;

Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

抽象类仅定义将由子类创建的一般属性和方法。

OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

继承示例(1)

#BlackPerson类 继承 Person类

#动作:

#BlackPerson可调用Person的talk方法

classPerson(object):deftalk(self):print("person is talking...l")classBlackPerson(Person):passb=BlackPerson()

b.talk()#输出结果

#person is talking...l

继承示例(2)

#BlackPerson类 继承 Person类

#动作:

#BlackPerson继承 新增方法walk

#BlackPerson继承 重写父类talk

classPerson(object):deftalk(self):print("person is talking...1")classBlackPerson(Person):deftalk(self):print("person is talking...2")defwalk(self):print("is walking....")

b=BlackPerson()

b.talk()

b.walk()#输出结果

#person is talking...2

#is walking....

继承式列(3)

------------------------------------------------------------------------------------------------------------------------

#BlackPerson类 WhitePerson 类 继承 Person类#动作1:#Person父类 添加name,age元素#注:父类添加元素后,对象也许添加元素否则报错#

#动作2:#BlackPerson类新建构造函数,并继承父类构建函数,先继承后重组。#注:子类需要有父类构造函数内的元素,后可新建元素,调用父类#成员属性下,添加构造函数。

##原理:#注:如图1,当子类函数,获取到name,age元素时,会传给下面父类的#子类元素,父类获取到子类元素会把传到的值,划分给构建函数内的#成员属性,完成先继承后重组的步骤。

#

#动作3:

#注:在子类继承父类后,可新建自己类的成员属性

#

#动作4:

#子类方法下也可使用父类的继承方法

#注:父类.方法(self) 但这样做没有意义。

classPerson(object):def __init__(self,name,age):

self.name= name #self = b self.name = b.name

self.age =age

self.sex= "noraml"

deftalk(self):print("person is talking...1")classBlackPerson(Person):def __init__(self,name,age ,strength): #先继承,在重构(动作1)

Person.__init__(self,name,age)  #父类调用子类元素(动作2)self.strength = tering        #继承父类后可调用自己的成员元素(动作3)

deftalk(self):

Person.tslk(self)           #调用父类方法(动作4)print("person is talking...2")defwalk(self):print("is walking....")

b= BlackPerson("Kevin","22")classWhitePerson(Person):pass

------------------------------------------------------------------------------------------------------------------------

类的继承(二)

实战案例

class SchoolMember(object): #基类

'''学校成员基类'''member= 0 #注册成员数

def __init__(self,name,age,sex): #基类构造函数

self.name =name

self.age=age

self.sex=sex

self.enroll()#注册方法,直接调用给子类

def enroll(self): #注册成员,每多出一个对象就+1

'''注册'''

print("just enrolled a new school member [%s]"%self.name)

SchoolMember.member+= 1

def tell(self): #问题2.在不改写子类的情况下,通过基类打印,不同子类的信息。

"""循环打印人员信息"""

print("-------info:%s---------"%self.name)for k,v in self.__dict__.items():print("\t",k,v)def __del__(self): #问题1,删除成员后自动减注册表。

'''析构函数,开除一个人后注册表-1'''

print("开除了[%s]..."%self.name)

SchoolMember.member-=1 #每有一个对象删除就减1

class Teacher(SchoolMember): #子类

'''讲师类'''

def __init__(self,name,age,sex,salary,course): #包含基类并新建元素

SchoolMember.__init__(self,name,age,sex) #继承基类构造

self.salary =salary

self.course=coursedef teching(self): #方法

print("Teacher[%s] is teaching [%s]"%(self.name,self.course))class Student(SchoolMember): #子类

"""学生"""

def __init__(self,name,age,sex,course,tuition): #包含基类并新建元素

SchoolMember.__init__(self,name,age,sex) #继承基类构造

self.course =course

self.tuition= tuition #fee学费

defpay_tuition(self,amount):print("student [%s] has just paied [%s]"%(self.name,amount))

self.amount+=amount

t1= Teacher("Wusir","28","F*M","8000","Python")

s1= Student("HaiTao","38","N/A","PYS15",300000)

s2= Student("LiChuang",12,"M","PYS15",11000)print(t1.__dict__) #打印变量t1的元素信息。

#问题2.在不改写子类的情况下,通过基类打印,不同子类的信息。#t1.tell()#s1.tell()#执行结果#-------info:Wusir---------#name Wusir#age 28#sex F*M#salary 8000#course Python#

#-------info:HaiTao---------#name HaiTao#age 38#sex N/A#course PYS15#tuition 300000

#问题1,删除成员后自动减注册表。#import time#del s2#print(SchoolMember.member)#time.sleep(5)#执行结果:#开除了[LiChuang]...#2#开除了[Wusir]...#开除了[HaiTao]...

注:析构函数,程序执行完毕后会自动输出。

类的继承(三)

继承写法

SchoolMember.__init__(self,name,age,sex) #经典类

super(Teacher, self).__init__(name,age,sex) #新式类

多继承

class School(object): #多继承类

'''学校类'''

definfo(self,addr):print("%s 6666666666666666"%addr)class Teacher(SchoolMember,School): #多继承

'''讲师类'''

def __init__(self,name,age,sex,salary,course): #包含基类并新建元素

SchoolMember.__init__(self,name,age,sex) #继承基类构造

#执行结果

#BJ 6666666666666666

School在 元素作为多继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值