抽象类
抽象类的概念:
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
抽象类的作用:
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性,
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
如果一组类中有相似的方法,为了方便使用可以使用抽象类将这些相似的方法定义到抽象类中,好像形成了一个接口,统一了这些相似的方法。
import abc #使用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta): #定义一个抽象类
all_type = "file"@abc.abstractmethod#装饰器的作用是实现抽象方法,无需实现功能
def read(self): #方法在子类中实现
pass@abc.abstractmethoddefwrite(self):pass
class Txt(All_file): #子类继承抽象类,就必须实现抽象类里的read和write方法
def __init__(self, name):
self.name=namedefread(self):print("%s可以被读取" %self.name)defwrite(self):print("%s可以被写入" %self.name)class Sata(All_file): #子类继承抽象类,就必须实现抽象类里的read和write方法
def __init__(self, name):
self.name=namedefread(self):print("%s可以被读取" %self.name)defwrite(self):print("%s可以被写入" %self.name)
txt= Txt("txt")
sata= Sata("sata")
txt.read()
txt.write()
sata.read()
sata.write()
抽象类和接口:
抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
多态和多态性
多态指一类事物的多种形态,他们都有相似的属性或技能
跟抽象类刚好一反,我们抽取类中相似的方法形成一个抽象类,那么这一系列类也正是这个抽象类的不同形态。
class Animal(metaclass=abc.ABCMeta): #动物类
def __init__(self, name):
self.name=name
@abc.abstractmethoddeftalk(self):pass
class People(Animal): #动物类的一种形态 人
def __init__(self, name):
self.name=namedeftalk(self):print("%s 说中国话" %self.name)class Dog(Animal): #动物类的另一种形态 狗
def __init__(self, name):
self.name=namedeftalk(self):print("%s 说汪汪" %self.name)
people= People("people")
dog= Dog("dog")
people.talk()
dog.talk()
多态性:
多态性是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:如下
class Animal(metaclass=abc.ABCMeta): #动物类
def __init__(self, name):
self.name=name
@abc.abstractmethoddeftalk(self):pass
class People(Animal): #动物类的一种形态 人
def __init__(self, name):
self.name=namedeftalk(self):print("%s 说中国话" %self.name)class Dog(Animal): #动物类的另一种形态 狗
def __init__(self, name):
self.name=namedeftalk(self):print("%s 说汪汪" %self.name)#更进一步,我们可以定义一个统一的接口来使用
deffunc(obj):
obj.talk()
people= People("people")
dog= Dog("dog")
func(people)
func(dog)
为什么要使用多态性:
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用