zoukankan      html  css  js  c++  java
  • python多态与抽象类

    一、多态

    1.1 什么是多态

    多态也称“多态性”,指的是同一种类型的事物,不同的形态。
    在python中的多态指的是让多种类若具备类似的数据属性与方法属性,都统一好命名规范,这样可以提高开发者的代码统一性,使得调用者更方便去理解。

    1.2 多态的目的:

    为了在不知道对象具体类型的情况下,统一对象调用方法的规范(名字)

    父类: 定制一套统一的规范。(比如: 方法名统一)
    子类: 遵循父类的统一的规范。(比如: 子类遵循父类方法名的统一)

    多态的三种表现形式

      1. 继承抽象类
        -耦合度极高,程序的可扩展性极低
      2. 继承父类
        -耦合度高,程序的可扩展性低
      3. 鸭子类型
        -耦合度低,程序的可扩展性高
    #动物类
    class Animal:
        #方法:吃
        def eat(self):
            pass
        #方法:叫
        def speak(self):
            pass
    
    #猪类
    class Pig(Animal):
        def eat(self):
            print('bia唧')
        def speak(self):
            print('哼哼哼')
    
    #猫类
    class Cat(Animal):
        def eat(self):
            print('咬...')
        def speak(self):
            print('喵喵喵')
    #狗类
    class Dog(Animal):
        def eat(self):
            print('叫...')
        def speak(self):
            print('汪汪汪')
            
    pig1 = Pig()
    cat1 = Cat()
    dog1 = Dog()
    
    # 设置一个接口
    def SPEAK(obj):
        obj.speak()
    
    SPEAK(pig1)     #pig1.speak()
    SPEAK(cat1)        #cat1.speak()
    SPEAK(dog1)     #dog1.speak()

    1.3 多态的好处:

    1.增加了程序的灵活性
      以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

    2.增加了程序的可扩展性
      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用  

    class People(Animal): #属于动物的另外一种形态:人
        def speak(self):
            print('say hi')
     
    def func(people): #对于使用者来说,自己的代码根本无需改动
        people.speak()
        
    people1=People() #实例出一个人
    func(people1) #甚至连调用方式也无需改变,就能调用人的talk功能
    '''
    这样我们新增了一个形态People,由People类产生的实例people1,使用者可以在完全不需要修改自己代码的情况下,
    使用和猫、狗、猪一样的方式调用people1的speak方法,即func(people1)
    '''

    二、抽象类

    2.1 什么是抽象类?

    在python内置的abc模块中,有一个抽象类,让子类必须遵循父类的编写规范。

    2.2 如何实现抽象类

    • 父类需要继承abc模块中的metaclass=abc.ABCMeta
    • 在父类的方法中,需要装饰上 abc.abstractmethod

    注意:

    1. 在python中不推荐使用抽象类。
    2. 子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个,可以多,但不能少
    import abc
    #动物类
    class Animal(metaclass = abc.ABCMeta):
        #方法:吃
        @abc.abstractmethod
        def eat(self):
            pass
        #方法:叫
        @abc.abstractmethod
        def speak(self):
            pass
    
    #猪类
    class Pig(Animal):
        def eat(self):
            print('bia唧')
    
        def speak(self):
            print('哼哼哼')
    
    
    pig1 = Pig()
    pig1.eat()

    三、鸭子类型

    3.1 什么是鸭子类型

    python崇尚鸭子类型,不同的对象,只要长得像鸭子,动作行为像鸭子,那它就是鸭子。
    鸭子类型是多态的一种表现形式。

    3.2 为什么要有鸭子类型

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

    #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
    class TxtFile:
        def read(self):
            pass
    
        def write(self):
            pass
    
    class DiskFile:
        def read(self):
            pass
        def write(self):
            pass
    序列类型:list,str,tuple
    
    l = lisst([1,2,3])
    s = str('hello')
    t = tuple((1,2,'a'))
    
    #我们可以在不考虑三者类型的前提下使用s,l,t
    l.__len__()
    s.__len__()
    t.__len__()
    str1 = 'bh'
    list1 = [1,2,3]
    
    # print(str1.__len__())
    # print(list1.__len__())
    
    # 自定义统计长度函数
    def LEN(obj):
        return obj.__len__()
    
    print(LEN(str1))
    print(LEN(list1))
  • 相关阅读:
    celery
    KeyError: 'pass_ticket'
    Go语言标准库之context
    Go语言标准库之log
    Go语言标准库之time
    Go语言基础之Cookie和Session
    #if...#endif的用法总结
    汇总#pragma用法
    Linux串口编程(转载)
    Linux系统调用(转载)
  • 原文地址:https://www.cnblogs.com/wddxx/p/13670447.html
Copyright © 2011-2022 走看看