Python 继承 |
类的继承(一)
继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。
Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
抽象类仅定义将由子类创建的一般属性和方法。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
继承示例(1)
#BlackPerson类 继承 Person类 #动作: #BlackPerson可调用Person的talk方法 class Person(object): def talk(self): print("person is talking...l") class BlackPerson(Person): pass b = BlackPerson() b.talk() #输出结果 #person is talking...l
继承示例(2)
#BlackPerson类 继承 Person类 #动作: #BlackPerson继承 新增方法walk #BlackPerson继承 重写父类talk class Person(object): def talk(self): print("person is talking...1") class BlackPerson(Person): def talk(self): print("person is talking...2") def walk(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) 但这样做没有意义。
class Person(object): def __init__(self,name,age): self.name = name #self = b self.name = b.name self.age = age self.sex = "noraml" def talk(self): print("person is talking...1") class BlackPerson(Person): def __init__(self,name,age ,strength): #先继承,在重构(动作1) Person.__init__(self,name,age) #父类调用子类元素(动作2)
self.strength = tering #继承父类后可调用自己的成员元素(动作3)
def talk(self):
Person.tslk(self) #调用父类方法(动作4) print("person is talking...2") def walk(self): print("is walking....") b = BlackPerson("Kevin","22") class WhitePerson(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(" ",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 = course def 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学费 def pay_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): #多继承类 '''学校类''' def info(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在 元素作为多继承。