zoukankan      html  css  js  c++  java
  • day22-类的多态

    一、多态

    多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
    所谓多态:调用的方法是同一个,但是执行的代码或者说现象不一样,此时就称为多态

    #我们编写了名为Animal、Dog、Cat的class:
    class Animal:
        def run(self):
            print('Animal is running...')
            
    class Dog:
        def run(self):
            print('dog is running')
    
    class Cat(Animal):
        def run(self):
            print('cat is running')
    
    #要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量:
    def run(obj):
        obj.run()
    
    #当我们传入Animal、Dog、Cat的实例时,run()就打印出:
    run(Animal())
    run(Dog())
    run(Cat())
    
    #结果:
    Animal is running...
    dog is running
    cat is running

    多态的好处就是,当我们需要传入Dog、Cat、……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思

    对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
    对扩展开放:允许新增Animal子类;
    对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

    二、多态性

    1、什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)
    多态性是指在不考虑实例类型的情况下使用实例

    在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息(obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

    比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

    2、多态性分为静态多态性和动态多态性
      静态多态性:如任何类型都可以用运算符+进行运算,任何序列类型都可以使用len()方法
      动态多态性:如上面的例子中都可以使用run()方法

    三、 鸭子类型

    Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
    python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
    也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

    四、例子

    狗和猫都是动物,它们之间就形成了一种继承关系
    Dog 和 Cat 继承了父类 Animal 的初始化方法,并重写了父类的 bark方法。

    class Animal:
    def __init__(self, name, color):
    self.name = name
    self.color = color
    def bark(self):
    print('动物在叫')
    def run(self):
    print('动物在跑')

    class Dog(Animal):
    def bark(self):
    print('%s的%s汪汪汪地叫' %(self.color, self.name))

    class Cat(Animal):
    def bark(self):
    print('%s的%s喵喵喵地叫' %(self.color, self.name))

    #可以看到不管animal具体是Dog还是Cat,都可以在for循环中执行bark这个方法。这就是面向对象的多态性特征。
    animal = [Dog('旺财', '黑色'), Cat('汤姆', '白色')]
    for i in animal:
    i.bark()

    结果:

      黑色的旺财汪汪汪地叫
      白色的汤姆喵喵喵地叫

  • 相关阅读:
    os模块
    sys模块
    psutil模块
    subprocess模块
    time模块
    argparse模块
    tcp端口扫描(python多线程)
    基于http的软件仓库
    SRE思想
    redis哨兵模式
  • 原文地址:https://www.cnblogs.com/dxnui119/p/9969063.html
Copyright © 2011-2022 走看看