面向对象(二)
一、继承和派生
二、组合
三、接口
四、抽象类
五、归一化设计
一、继承和派生
继承
1.继承是什么
一种创建新类的方式,子类继承父类
#父类
class A:
pass
#子类
class B(A):
pass
2.如何寻找继承关系
继承是一种‘是’的关系,例如:哺乳动物是动物
3.为什么用继承
解决代码重用问题,解决什么是什么的关系
派生
1.什么是派生
子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新的属性与父类的某个属性名字相同,那么再调用子类的这个属性,就优先调用子类的属性
2.子类重用父类的函数
父类.父类的函数(参数)
class People:
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex
def walk(self):
print('%s is walking' %self.name)
class Chinese(People): #Chinese继承People
country='China'
def __init__(self,name,sex,age,language='Chinese'): #派生__init__()
People.__init__(self,name,sex,age) #子类重用父类的__init__()
self.language=language
def walk(self): #派生walk()
People.walk(self)
二、组合
1.什么是组合
组合也是也重用代码的一种方式
对比继承来说,组合描述的是一种“有”的关系
2.使用方式
在一个类中以另外一个类的对象作为数据属性
class Course:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period
class Teacher:
def __init__(self,name,course):
self.name=name
self.course=course
class Student:
def __init__(self,name,course):
self.name=name
self.course=course
python=Course('python',15800,'7m')
t1=Teacher('egon',python) #Teacher以Course的对象python作为数据属性
s1=Student('alex',python) #Student以Course的对象python作为数据属性
#调用方式
print(s1.course.name)
print(s1.course.period)
三、接口
1.python中没有接口的概念,没有interface关键字来定义一个接口
2.python中通过继承方式实现接口功能
首先,定义个接口类Interface,Interface中定义了需要实现哪些功能的接口名(也就是函数名),不需要实现函数功能;然后,子类继承Interface,实现接口中函数功能,实现接口功能
class Interface:#定义接口Interface类来模仿接口的概念
def read(self): #定接口函数read
pass
def write(self): #定义接口函数write
pass
class Txt(Interface): #文本,具体实现read和write
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
class Sata(Interface): #磁盘,具体实现read和write
def read(self):
print('硬盘数据的读取方法')
def write(self):
print('硬盘数据的读取方法')
注:这种通过继承的方式实现的接口对与子类实现接口功能没有任何限制作用
四、抽象类
1.什么是抽象类
抽象类是一个特殊的类,只能被继承 不能被实例化
2.抽象类的意义
类是根据对象抽象而来,抽象类就是根据类抽象而来的。
抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法,这样就子类起到了限制作用
3.抽象类的使用
首先,需要调用abc模块,
然后,类的参数需要添加(metaclass=abc.ABCMeta)
最后,定义一个类,类中的方法添加@abc.abstractmethod装饰器
import abc #利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
# class Txt(All_file):
# pass
#
# t1=Txt() #报错,子类没有定义抽象方法
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
五、归一化设计
就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样,也就是归一化
归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计