一甲子余温

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

抽象类                                                                                                                   

抽象类的概念:

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。

抽象类的作用:

如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性,

 

从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

 

从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。

如果一组类中有相似的方法,为了方便使用可以使用抽象类将这些相似的方法定义到抽象类中,好像形成了一个接口,统一了这些相似的方法。

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)去调用   

 

posted on 2019-05-08 19:05  一甲子余温  阅读(204)  评论(0编辑  收藏  举报