抽象类
抽象类的概念:
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
抽象类的作用:
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性,
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。
如果一组类中有相似的方法,为了方便使用可以使用抽象类将这些相似的方法定义到抽象类中,好像形成了一个接口,统一了这些相似的方法。
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): # 子类继承抽象类,就必须实现抽象类里的read和write方法 def __init__(self, name): self.name = name def read(self): print("%s可以被读取" % self.name) def write(self): print("%s可以被写入" % self.name) class Sata(All_file): # 子类继承抽象类,就必须实现抽象类里的read和write方法 def __init__(self, name): self.name = name def read(self): print("%s可以被读取" % self.name) def write(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.abstractmethod def talk(self): pass class People(Animal): # 动物类的一种形态 人 def __init__(self, name): self.name = name def talk(self): print("%s 说中国话" % self.name) class Dog(Animal): # 动物类的另一种形态 狗 def __init__(self, name): self.name = name def talk(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.abstractmethod def talk(self): pass class People(Animal): # 动物类的一种形态 人 def __init__(self, name): self.name = name def talk(self): print("%s 说中国话" % self.name) class Dog(Animal): # 动物类的另一种形态 狗 def __init__(self, name): self.name = name def talk(self): print("%s 说汪汪" % self.name) #更进一步,我们可以定义一个统一的接口来使用 def func(obj): obj.talk() people = People("people") dog = Dog("dog") func(people) func(dog)
为什么要使用多态性:
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用