zoukankan      html  css  js  c++  java
  • 多态,鸭子模型

    多态

    多态指的是同一种类型的事物,不同的形态

    多态的目的:

    多态也称之为‘多态性’,目的是为了 在不知道对象具体类型的情况下,统一对象调用的方法规范(比如:名字)

    多态的表现“形式之一”就是继承

    ​ 先抽象,再继承

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
        @abc.abstractmethod
        def talk(self):
            pass
    
    class 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 henghengheng')
    

    Python的多态性是指:在不考虑实例类型的情况下使用实例,也就是说不同类型的实例有 相同的调用方法。比如人,猫,狗,等等只要是继承了animal就可以直接调用它的talk()方法

    peo=People()
    dog=Dog()
    pig=Pig()
    
    #peo、dog、pig都是动物,只要是动物肯定有talk方法
    #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
    peo.talk()
    dog.talk()
    pig.talk()
    
    #更进一步,我们可以定义一个统一的接口来使用
    def func(obj):
        obj.talk()
    

    1.增加了程序的灵活性

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

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

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

    抽象类

    1、在python中内置的abc模块中,有一个抽象类

    2、抽象类的作用:让子类必须遵循父类的编写规范

    3.如何实现抽象类

    父类需要继承abc模块中,metaclass=abc.ABCMeta

    在父类的方法中,需要装饰上 abc.abstractmethod

    注意 在python中不推荐使用抽象类。

    注意: 子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个)

    鸭子类型

    1.什么是鸭子类型?

    不同的对象,只要长得像鸭子,动作行为像鸭子,那它就是鸭子!

    当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子.

    鸭子类型是多态的一种表现形式。

    2.为什么要有鸭子类型?
    不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范。
    所有的类,在定义时都按照统一的规范进行编写。

    • 多态的三种表现形式:
      • 继承父类 ****

        • 耦合度高,程序的可扩展性低
      • 继承抽象类 ***

        • 耦合度极高,程序的可扩展性极低
      • 鸭子类型: *****

        • 耦合度低,程序的可扩展性高
    class A:
        def login(self):
            pass
        def register(self):
            pass
    
    class B:
        def login(self):
            pass
        def register(self):
            pass
    
    # A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
    # 里面的相似的功能让其命名相同.
    # A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.
    
    ## 个人理解:
        #你可以定义一个公共的接口, 简化代码 .牛逼人都这么干
        def func(obj):
           obj.register()
           obj.login()
    

    __len__()

    str1 = 'tank is very handsome!!!'
    list1 = ['tank', 'is', 'very', 'handsome!!!']
    
    # print(str1.__len__())
    # print(list1.__len__())
    
    # 自定义统计长度函数
    def LEN(obj):
        return obj.__len__()
    
    print(LEN(str1))
    print(LEN(list1))
    
    print(len(str1))
    print(len(list1))
    
    
  • 相关阅读:
    CentOS 6.4 利用 Awstats 7.2 分析 Nginx 日志
    CentOS 6.4 x64 postfix + dovecot + 虚拟用户认证
    配置日志logwarch 每天发送到邮箱
    CentOSx64 安装 Gearmand 和 Gearman php扩展
    Redis之基本介绍
    Synchronized锁的基本介绍
    Lock的基本介绍
    java之threadlocal的使用
    Java之事务的基本应用
    linux之cp和scp的使用
  • 原文地址:https://www.cnblogs.com/kai-/p/11951836.html
Copyright © 2011-2022 走看看