• 多态,鸭子类型


    多态

    python中处处是多态

    python是一门自带多态的语言

    java中的多态

    强数据类型的语言

    什么是多态:

    一个类表现出来的多种状态

     支付Payment是一个类,多种状态: 使用阿里支付Alipay,使用微信支付Wechatpay
     支付表现出来的多种状态 :
         第一种状态 支付宝支付
         第二种状态 微信支付

     class Animal(object):pass
     class Cat(Animal):
         def eat(self):pass
     class Dog(Animal):
         def eat(self):pass
     def eat(Animal obj):
         obj.eat()
     小花 = Cat()  # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
     小黑 = Dog()
     eat(小花)
     eat(小黑)
     int str list tuple dict set 内置的数据类型
     Cat Dog Animal 自定义的类/数据类型
     动物吃表现出来的多种状态:
         猫吃
         狗吃
    

     python当中的多态

     class Alipay(object):
         def pay(self,money):
             pass
     class Wechatpay(object):
         def pay(self,money):
             pass
     def pay(person_obj,money):
         person_obj.pay(money)
     alex = Alipay()
     pay(alex,24.5)
     yuan = Wechatpay()
     print(yuan,23.5)
     pay('abc',23.5)
    

      

     python
     class Cat(object):
         def eat(self):pass
     class Dog(object):
         def eat(self):pass
     def eat(obj):
         obj.eat()
     小花 = Cat()  # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
     小黑 = Dog()
     eat(小花)
     eat(小黑)
     动物吃表现出来的多种状态:
         猫吃
         狗吃
    


    在python中体现的多态:
               几个类拥有同名的方法,可以写一个函数,来统一进行调用 - 归一化设计
    java要要求传递数据的数据类型? (通过继承来实现的)
              是为了代码不出错,只要你能够顺利的调用这个函数,那么内部的执行就大大降低出错的概率
    python却不要求?
              更多的不是硬性的规定,但是可能会因为传递的参数不符合规则而使得代码报错,但是大大降低了代码繁琐程度

    鸭子类型:

    python特有的  鸭子类型是相对论

    len()这个函数来说: str list dict set tuple 都是鸭子类型

          鸭子 == 数据集合

          对于len来说,它不关心给我的是一个具体的什么数据类型

          只关心 能够计算长度的就是我接受的参数

    在java中 用多态实现的

    def  len(object , obj):
            print("*" *20)
            return obj.__len()
    
    print(len("abcd"))
    print(len([1,2,3]))
    

    在python中 用鸭子类型

           不关心这个对象的数据类型,只要这个对象含有一个__len__就可以了
        对于len函数来说,含有__len__的所有的类都是鸭子类型

    def len(obj):
           print("*" *20)
           return obj.__len__()
    
    
    print(len("abcd"))
    
    print(len([1,2,3]))
    
     class Cat():
         def eat(self):pass
         def sleep(self):pass
         def drink(self):pass
         def play(self):pass
     class Dog():
         def eat(self):pass
         def sleep(self):pass
         def drink(self):pass
         def play(self):pass
    
     Cat和Dog就认为是鸭子类型
     绝对的像 : 狗有的猫都有
    

    鸭子类型
        是python语言中特有的,不依赖于继承和规范来进行的一种约定(依赖继承和规范特指:java中的多态和接口)
        如果两个类都需要做某一件事 

    中心思想 :

         不同类之间的相同的方法都应该用同一个名字 

    抽象类 规范 : 不同类之间的相同的方法都应该用同一个名字

    接口类 规范: 不同类之间的相同的方法都应该用同一个名字

    归一化设计 :为了使用不同类中的方法,而要求 不同类之间的相同的方法都应该用同一个名字

    class Cat():
        def eat(self):pass
    class Dog():
        def eat(self):pass
    def eat(obj):
        obj.eat()
    

      

    多态  : 已经实现了"不同类之间的相同的方法都用同一个名字",解决不同类的对象的传参问题

     class Animal:pass
     class Cat(Animal):
         def eat(self):pass
     class Dog(Animal):
         def eat(self):pass
     def eat(Animal obj):
         obj.eat()

    鸭子类型  : 不需要解决类的对象的传参问题,就可以直接利用已经实现的"不同类之间的相同的方法都用同一个名字"

    class Cat:
        def eat(self):pass
    class Dog:
        def eat(self):pass
    def eat(obj):
        obj.eat()
    

      

  • 相关阅读:
    【持续更新】GDB使用笔记
    PL/SQL Developer-官网下载地址
    kali 下程序卸载方法
    python2 安装scrapy出现错误提示解决办法~
    pyHook监听用户鼠标、键盘事件
    pip 安装pandas报UnicodeDecodeError: 'ascii' codec can't decode byte 0xd5错
    Python模块常用的几种安装方式
    解决Kali Linux没有声音
    关于破解路由器密码
    解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
  • 原文地址:https://www.cnblogs.com/baoshuang0205/p/10021020.html
Copyright © 2020-2023  润新知