zoukankan      html  css  js  c++  java
  • 多态性与鸭子类型

    多态性与鸭子类型

    一、多态

    • 什么是多态

      • 多态指的是同一种类型的事物,不同的形态
    • 多态的目的

      • "多态"也称之为"多态性",目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字)
    • 多态性的好处

      • 在于增强了程序的灵活性和可扩展性
    • 多条的表现"形式之一"就是继承:

      • 先抽象,再继承
      • 父类:定制一套统一的规范(比如:方法名统一)
      • 子类:遵循父类的统一的规范(比如:子类遵循父类方法名的统一)
    class Animal:
        # 方法 吃
        def eat(self):
            pass
        # 方法 叫
        def speak(self):
            pass
    # 猪类
    class Pig(Animal):
        def eat(self):
            print('bia ji bia ji...')
        def speak(self):
            print('哼哼哼...')
    # 猫类
    class Cat(Animal):
        def eat(self):
            print('yao ji yao ji...')
        def speak(self):
            print('喵喵喵...')
    # 狗类
    class Dog(Animal):
        def eat(self):
            print('tian ji tian ji...')
        def speak(self):
            print('汪汪汪...')
    animal1 = Pig()
    animal2 = Cat()
    animal3 = Dog()
    # 吃起来
    animal1.eat()
    animal2.eat()
    animal3.eat()
    print('='.center(30, '='))
    # 叫起来
    animal1.speak()
    animal2.speak()
    animal3.speak()
    

    注意:在python中不会强制限制子类必须遵循父类的规范,所以出现了抽象类

    二、抽象类

    • 什么是抽象类
      • 在python内置的abc模块中,有一个抽象类
    • 抽象类的作用
      • 让子类必须遵循父类的编写规范
    • 如何实现抽象类
      • 父类需要继承abc模块中,metaclass = abc.ABCMeta
      • 在父类的方法中,需要装饰上 abc.abstractmethod

    注意:在python中不推荐使用抽象类

    注意:子类必须按照父类的方法编写规范,缺一不可(只要父类中有几个抽象方法,子类就必须要定义几个)

    import abc	# 导入abc模块
    # 父类
    class Animal(metaclass = abc.ABCMeta): # 父类名后继承abc
        # 方法 吃
        @abc.abstractmethod	# 在方法上装饰上此装饰器
        def eat(self):
            pass
        # 方法叫
        @abc.abstractmethod
        def speak(self):
            pass
    # 猪类
    class Pig(Animal):
        def run(self):
            print('running...')
        def eat(self):
            print('bia ji bia ji...')
        def shuo(self):	# 当这里没有按照父类中的speak编写,下面就无法调用
            print('哼哼哼...')
    pig_obj = Pig()
    pig_obj.run()
    pig_obj.shuo()	# 这里会报错,所以子类中须按照父类的speak书写
    

    三、鸭子类型

    • 什么是鸭子类型
      • 不同的对象,只要长的像鸭子,动作行为像鸭子,那它就是鸭子
      • 鸭子类型是多态的一种表现形式
    • 为什么要有鸭子类型
      • 不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范
      • 所有的类,在定义时都按照统一的规范进行编写
    • 多态的三种表现形式
      • 继承父类
        • 耦合度高,程序可扩展性差
      • 继承抽象类
        • 耦合度极高,程序的可扩展性极差
      • 鸭子类型
        • 耦合度低,程序的可扩展性强

    注意:在python中,强烈推荐使用鸭子类型

    # 二者看起来都像文件文件,因而就可以当文件一样去用,然而它们并没有直接的关系
    class Txt:  # Txt类有两个与文件类型同名的方法,即read和write
        def read(self):
            pass
        def write(self):
            pass
    
    class Disk: #Disk类也有两个与文件类型同名的方法:read和write
        def read(self):
            pass
        def write(self):
            pass
    
  • 相关阅读:
    vue --- 全局弹窗,只调用对应实例
    代理相关;win操作
    mongoBD + node + express
    菜鸟初学 node 推荐 亲测easy
    H5 ---- 点击遍历所有标签,复制对应的文本
    async与await初步应用
    C# Enum 添加自定义Attribute,然后通过泛型与反射的方式得到事先定义的标记
    VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误
    C# 获取数组的内存地址
    利用反射插入数据库与更新数据库
  • 原文地址:https://www.cnblogs.com/YGZICO/p/11959749.html
Copyright © 2011-2022 走看看