zoukankan      html  css  js  c++  java
  • python类的三大特性---多态

    抽象类                                                                                                                   

    抽象类的概念:

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

    抽象类的作用:

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

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

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

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

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

  • 相关阅读:
    PCB封装分配
    1.26-CAD异形封装的制作
    1.40-CAE封装6个实例单门制作
    简单的URL解析
    冒泡排序和简单的递归
    作用域的提升
    数组的去重,以及随机一个验证码
    数组和字符串的相互转换。
    substring,substr,和slice的区别详解。
    去除Input输入框中边框的方式
  • 原文地址:https://www.cnblogs.com/zt0903/p/10833777.html
Copyright © 2011-2022 走看看