• 🍖鸭子类型


    引入

    上一篇我们谈到使用 abc 模块来强制的要求子类必须要有父类中的某些方法才能保证多态, 但这不是Python推崇的方法, 下面我们来介绍鸭子类型是如何实现使用多态的

    一.什么是鸭子类型

    v2-b789d8e597d920061dcd4efb585cd343_hd

    鸭子类型, 即一个对象看起来像鸭子, 走路像鸭子, 说话也像鸭子, 具备了鸭子的所有特征和行为, 那么我们就可以说这个对象就是的鸭子

    二.为什么推崇鸭子类型

    使用鸭子类型, 我们完全可以不依赖继承, 只需要制造出外观和行为相同的对象, 并且可以实现不考虑对象类型的情况下来使用对象

    • 例 : 一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子
    • 例 : 一条狗走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这条狗就可以被称为鸭子 (当然鸭子的特性不止这些)

    v2-f4bcc55c40efedc78401a3b6c59e50e5

    三.鸭子类型示例

    • 例一 :
    class 看时间:
        def look_time(self):
            print("看时间")
            
    都没有父类
    class Watchs:
        def look_time(self):
            print("使用手表看时间")
    
    class Phone:
        def look_time(self):
            print("使用手机看时间")
    
    class Sundial:
        def look_time(self):
            print("使用日晷看时间")
    
    W1 = Watchs()
    P1 = Phone()
    S1 = Sundial()
    
    只要"W1、P1、S1"他们都有相同的方法(一个或多个), 我们就可以说他们是属于同一个类(例:看时间类),于是就可以使用多态
    W1.look_time()  # 使用手表看时间
    P1.look_time()  # 使用手机看时间
    S1.look_time()  # 使用日晷看时间
    
    • 例二 :
    我们一直正在使用的多态
    s = str('paidaxing')
    l = list([1,2,3,4,5])
    t = tuple((1,2,3,4))
    
    我们可以在不用考虑"s,l,t"的类型下使用"__len__()"方法和"print()"等等
    s.__len__()
    l.__len__()
    t.__len__()
    
    print(s)
    print(l)
    print(t)
    

    ps : Python, Go 语言中实现多态可以不需要继承父类, 而其他语言总需要(例:Java)

  • 相关阅读:
    树形地铁系统[树的最小表示]
    156. 矩阵[二维的hash]
    兔子与兔子
    滑动窗口【单调队列入门题】
    【YBTOJ】生日相同
    【YBTOJ】移位包含
    【YBTOJ】【HDUOJ 3085】逃离噩梦
    【YBTOJ】立体推箱子
    【CodeForces 1408F】Two Different
    【Luogu P3338】[ZJOI2014]力
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14187564.html
Copyright © 2020-2023  润新知