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

  • 相关阅读:
    pat 甲级 1065. A+B and C (64bit) (20)
    pat 甲级 1064. Complete Binary Search Tree (30)
    pat 甲级 1010. Radix (25)
    pat 甲级 1009. Product of Polynomials (25)
    pat 甲级 1056. Mice and Rice (25)
    pat 甲级 1078. Hashing (25)
    pat 甲级 1080. Graduate Admission (30)
    pat 甲级 团体天梯 L3-004. 肿瘤诊断
    pat 甲级 1099. Build A Binary Search Tree (30)
    Codeforce 672B. Different is Good
  • 原文地址:https://www.cnblogs.com/zt0903/p/10833777.html
Copyright © 2011-2022 走看看