zoukankan      html  css  js  c++  java
  • 4 [面向对象]-三大特性:多态

    1、多态

    多态指的是一类事物有多种形态,比如

    动物有多种形态:人,狗,猪

    # 多态:同一类事物的多种形态
    import abc
    
    class Animal(object, metaclass=abc.ABCMeta):  # 同一类事物:动物
        @abc.abstractmethod
        def talk(self):
            pass
    
    class People(Animal): # 动物的形态之一:人
        def talk(self):
            print('say hi')
    
    class Dog(Animal):  # 动物的形态之二:狗
        def talk(self):
            print('wang wang wagn')
    
    class Cat(Animal):  # 动物的形态之三:猫
        def talk(self):
            print('miao miao miao')
    

      

    2、多态性

      (1) 什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)

    多态性是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性

    静态多态性:如任何类型都可以用运算符+进行运算
    
    动态多态性:如下
    

      

    # 多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
    alex = People()
    dog1 = Dog()
    tom = Cat()
    
    #peo、dog、pig都是动物,只要是动物肯定有talk方法
    #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
    alex.talk()
    dog1.talk()
    tom.talk()
    
    #更进一步,我们可以定义一个统一的接口来使用
    def func(obj):
        obj.talk()
    
    fun(alex)
    fun(dog1)
    fun(tom)

      学开车

    •  开奥迪
    •  开特斯拉
    •  开拖拉机

      (2)为什么要用多态性(多态性的好处)

    其实大家从上面多态性的例子可以看出,我们并没有增加什么新的知识,也就是说python本身就是支持多态性的,这么做的好处是什么呢?

    1.增加了程序的灵活性

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

      

    2.增加了程序额可扩展性

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

     

    3、鸭子类型

    逗比时刻:

    Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

    python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

    也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

    例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

    #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
    class File(object):
        def read(self):
            print('file read')
        def write(self):
            print('file write')
    
    class Disk(object):
        def read(self):
            print('Disk read')
        def write(self):
            print('Disk write')
    
    class Text(object):
        def read(self):
            print('Text read')
        def write(self):
            print('Text write')
    
    file = File()
    disk = Disk()
    text = Text()
    
    file.read()
    file.write()

    例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

    # 序列类型:list列表, 元组tuple, 字符串str
    
    l = list([1,2,3])
    t = tuple(('a','b',3))
    s = str('hello')
    
    # print(l.__len__())
    # print(t.__len__())
    # print(s.__len__())
    
    
    # 同一个接口
    def len(obj):
        return obj.__len__()
    
    print(len(l))
    print(len(t))
    print(len(s))

    4

    5

  • 相关阅读:
    MySQL数据库的创建&删除&选择
    JS实现异步的几种方式
    十种排序算法实例说明总结
    常用的bug管理工具
    Bootstrap+Hbuilder
    从菜鸟的视角看测试!
    安装numpy和matplotlib
    Eclipse在线安装svn
    重新打个招呼
    <USACO09JAN>气象测量/气象牛The Baric Bovineの思路
  • 原文地址:https://www.cnblogs.com/venicid/p/8605622.html
Copyright © 2011-2022 走看看