zoukankan      html  css  js  c++  java
  • 面向对象三大特性之多态

    面向对象三大特性之多态

    • 什么是多态

      不同对象响应同一种方法的表现出不同的行为,产生不同的结果

      用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以 在不用考虑对象具体类型的前提下而直接使用对象下的方法

    • 为什么要有多态

      1. 增加了程序的灵活性

        以不变应万变,不论对象千变万化,使用者都是以同一种形式去调用,如func(animal)

      2. 提高程序的拓展性

        通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用  

    • 怎么用多态

      让几个不同的类拥有相同的父类,继承了相同的方法,然后重新定义其方法,这样用相同的方法就能产生不同的结果.

    class Animal:
        def eat(self):
            print('动物在吃草')
    ​
    ​
    class Person(Animal):
        def eat(self):  # 定义人的方法
            print('人吃粮食...')
    ​
    ​
    class Pig(Animal):
        def eat(self):  # 定义猪的方法
            print('猪吃饲料...')
    ​
    ​
    class Dog(Animal):
        def eat(self):  #定义狗的方法
            print('狗吃骨头...')
    ​
    # 产生对象
    person = Person()
    pig = Pig()
    dog = Dog()
    ​
    ​
    # 调用不同对象的同一方法,产生不同结果(多态性的体现)
    peo.talk()
    dog.talk()
    pig.talk()
    ​
    ​
    def func(animal):  # 可以进一步封装成一个接口,传入什么对象就调用它的方法
        animal.eat()
    ​
    ​
    func(pig)
    ​
    • abc模块

      abstract的缩写 ,抽象的意思

      • 使用ABC模块的步骤

        1. 为类中指定元类为metaclass = abc.ABCMeta

        2. 在相应的方法上加上@abc.abstractmethod

      import abc
      class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
          @abc.abstractmethod
          def talk(self):
              passclass People(Animal): #动物的形态之一:人
          def talk(self):
              print('say hello')
      ​
      class Dog(Animal): #动物的形态之二:狗
          def talk(self):
              print('say wangwang')
      ​
      class Pig(Animal): #动物的形态之三:猪
          def talk(self):
              print('say aoao')
              
              
      # 使用ABC装饰器的目的,将基类变为抽象基类,严格要求子类对象必须使用基类中被装饰的的方法,如果子类中没有该方法则报错.
    • 鸭子类型

      • 在现实中一个物体叫声象鸭子,走路也像鸭子,那么人们就把它当做鸭子

      • 对应到编程中就是两个独立的类,没有任何关联,但是两者的方法和 属性都一致(长得像),那么两者就可以实现多态(不同对象响应同一种方法的表现出不同的行为,产生不同的结果).这就是鸭子类型.

    # 类Foo和Bar都拥有两种相同的方法,故两者称之为鸭子类型
    class Foo:
        def f1(self):
            print('from foo.f1')
    ​
        def f2(self):
            print('from foo.f2')
    ​
    ​
    class Bar:
        def f1(self):
            print('from bar.f1')
    ​
        def f2(self):
            print('from bar.f2')
    ​
    ​
    obj1 = Foo()
    obj2 = Bar()
    ​
    # (obj1,obj2)不同对象针对同一方法(f1)产生不同的结果
    obj1.f1()
    obj2.f1()
    #  (obj1,obj2)不同对象针对同一方法(f2)产生不同的结果
    obj1.f2()
    obj2.f2()

     

  • 相关阅读:
    操作数据库pymysql
    深度学习-目标检测(Fast R-CNN)
    解释--全连接层输入大小固定
    深度学习-目标检测(IOU)
    深度学习-目标检测(SPPNet)
    深度学习-目标检测(R-CNN)
    机器学习-Whitening(白化)
    Win10 将slim加入PYTHONPYTH
    tensorboard 使用
    卷积神经网络--padding
  • 原文地址:https://www.cnblogs.com/liusijun113/p/10138467.html
Copyright © 2011-2022 走看看