继承是指:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(1)通过继承创建的新类称为“子类”或“派生类”。
(2)被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
2、继承的分类
继承概念的实现方式主要有2类:实现继承、接口继承。
(1) 实现继承是指使用基类的属性和方法而无需额外编码的能力;
(2)接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构父类方法);
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。
抽象类仅定义将由子类创建的一般属性和方法。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
3、示例代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#类的继承
classPeople:
def__init__(self,name,age):
defeat(self):
defsleep(self):
deftalk(self):
classMan(People):#继承父类People类
defmake_money(self):
defsleep(self):
print("man is sleeping...")
classWomen(People):
defshop(self):
m1 = Man("Jack","20")
w1 = Women("Amy","25")
#运行结果:
Jackiseating...
Jackismaking money...
Jackissleeping...
manissleeping...
Amyistalking...
Amyisshopping...
4、子类中对父类的构造函数进行重构两种方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#类的继承
#class People: #经典类
classPeople(object):#新式类
def__init__(self,name,age):
defeat(self):
defsleep(self):
deftalk(self):
classMan(People):#继承父类People类
def__init__(self,name,age,money):
#People.__init__(self,name,age) #(方法一)对构造函数进行重构、添加父类中没有的属性
super(Man,self).__init__(name,age)#(方法二)利用super对构造函数进行重构(新式类写法)
defmake_money(self):
defsleep(self):
print("man is sleeping...")
classWomen(People):
defshop(self):
m1 = Man("Jack","20",10)
w1 = Women("Amy","25")
#运行结果:
Jack have money10$
Jackiseating...
Jackismaking money...
Jackissleeping...
manissleeping...
Amyistalking...
Amyisshopping...
5、多继承方式
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#类的继承
#class People: #经典类
classPeople(object):#新式类
def__init__(self,name,age):
defeat(self):
defsleep(self):
deftalk(self):
classRelationship(object):
defmake_friends(self,obj):
classMan(People,Relationship):#多继承
def__init__(self,name,age,money):
#People.__init__(self,name,age) #(方法一)对构造函数进行重构、添加父类中没有的属性
super(Man,self).__init__(name,age)#(方法二)利用super对构造函数进行重构(新式类写法)
defmake_money(self):
defsleep(self):
print("man is sleeping...")
classWomen(People,Relationship):#多继承
defshop(self):
m1 = Man("Jack","20",10)
w1 = Women("Amy","25")
#运行结果:
Jack have money10$
Jackismaking friendswithAmy
[<__main__.Women object at0x0057FA30>]
6、新式类与经典类的继承顺序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
classA(object): #新式类
def__init__(self):
print("A")
classB(A):
def__init__(self):
print("B")
classC(A):
def__init__(self):
print("C")
classD(B,C):
def__init__(self):
pass
#print("D")
obj = D()
7、继承示例——学校、教师与学生
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#继承实例(新式类)——模拟学校、教师与学生
classSchool(object):
def__init__(self,name,addr):
defenroll(self,stu_obj):#学生注册
defheir(self,staff_obj):#聘请教师
classSchoolMember(object):
def__init__(self,name,age,sex):
deftell(self):
pass
classTeacher(SchoolMember):
def__init__(self,name,age,sex,salary,course):
super(Teacher,self).__init__(name,age,sex)
deftell(self):
print('''
----- info of Teacher:%s -----
Name:%s
Age:%s
Sex:%s
Salary:%s
Course:%s
defteach(self):
classStudent(SchoolMember):
def__init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex)
deftell(self):
print('''
----- info of Student:%s -----
Name:%s
Age:%s
Sex:%s
Stu_id:%s
Grade:%s
defpay_tuition(self,amount):
#实例化
school = School("qinghua","beijing")
t1 = Teacher("Jack","30","M","20000","Python")
t2 = Teacher("Amy","28","F","15000","Linux")
s1 = Student("liu","23","M","1701","Python")
s2 = Student("wang","25","F","1702","Linux")
#调用显示学生与教师的信息
#聘请的第一位教师教课
#运行结果:
----- info of Teacher:Jack -----
Name:Jack
Age:30
Sex:M
Salary:20000
Course:Python
----- info of Student:liu -----
Name:liu
Age:23
Sex:M
Stu_id:1701
Grade:Python
聘请教师 Jack
liu 学员办理注册
wang 学员办理注册
[<__main__.Teacher object at0x0059FDB0>]
[<__main__.Student object at0x0059FDF0>, <__main__.Student object at0x0059FE10>]
Jackisteaching course [Python]
liu has paied tuitionfor$5000
wang has paied tuitionfor$5000
8、多态(polymorphisn)——一种接口,多种形态
(1)定义
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
多态的作用:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。
而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
Pyhon 很多语法都是支持多态的,比如 len(),sorted(), 你给len传字符串就返回字符串的长度,传列表就返回列表长度。
(2)示例代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
classAnimal(object):
def__init__(self,name):
deftalk(self):
raiseNotImplementedError("Subclass must implement abstract method")
# 多态——一种接口,多种形态
@staticmethod
defanimal_talk(obj):
classCat(Animal):
deftalk(self):
classDog(Animal):
deftalk(self):
d = Dog("A")
c = Cat("B")
#多态
#运行结果:
A Woof! Woof!
B Meow!
9、面向对象设计利器——领域建模
(1)定义
从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向 对象设计的一座桥梁。
领域模型,顾名思义,就是需求所涉及的领域的一个建模,更通俗的讲法是业务模型。
(2)领域模型有两个主要的作用:
发掘重要的业务领域概念
建立业务领域概念之间的关系
(3)领域建模三字经
领域模型如此重要,领域建模的方法概括一下就是“找名词”! 即使是简单的找名词这样的操作,也涉及到分析和提炼,而 不是简单的摘取出来就可,
这种情况下分析师和设计师的经验和技能就能够派上用场了。但领域模型分析 也确实相对简单,即使没有丰富的经验和高超的技巧,至少也能完成一个能用的领域模型。
一个关键的问题:从哪里找? 因为领域模型是“需求到面向对象的桥梁”,能想到:从需求模型中找,具体来说就是从用例中找。
归纳:领域建模的方法就是“从用例中找名词”。 当然,找到名词后,为了能够更加符合面向对象的要求和特点。
我们还需要对这些名词进一步完善,这就 是接下来的步骤:加属性,连关系!