面向對象三大特性之多態

面向對象三大特性之多態

一、什麼是多態

多態指的是同一類事物有多種不一樣的形態python

二、爲何要用多態

多態也稱爲多態性,目的是爲了 在不知道對象具體類型的狀況下,統一對象的調用方法的規範函數

三、多態的三種表現形式

一、繼承父類

耦合度高,程序可擴展性低code

父類:定製一套統一的規範(好比方法名統一)對象

子類:遵循父類的統一規範(好比子類要遵循父類方法名統一)繼承

注意:在python中不會強制限制子類必需要遵循父類的規範,因此出現了抽象類it

class Animal:
    def speak(self):
        pass
    def eat(self):
        pass

class Dog(Animal):
    def speak(self):  # 遵循父類的speak
        print('汪汪汪~')
    def eat(self):  # 遵循父類的eat
        print('舔狗~')

class Pig(Animal):
    def speak(self):  # 遵循父類的speak
        print('哼哼哼~')
    def eat(self):  # 遵循父類的eat
        print('嗯嗯嗯~')
# 統一了對象的調用方式
dog_obj = Dog()
pig_obj = Pig()
dog_obj.speak()
pig_obj.speak()
dog_obj.eat()
pig_obj.eat()

二、繼承抽象類

一、什麼是抽象類

在python內置的abc模塊中有一個抽象類class

二、抽象類的做用

讓子類必須遵循父類的編寫規範import

三、如何實現抽象類

  1. 父類須要繼承abc抽象類,metaclass=abc.ABCMeta擴展

  2. 在父類的方法中須要裝飾上,abc.abstractmethodmeta

注意:python中不推薦使用抽象類,由於耦合度極高,可擴展性極低

子類必須按照父類的方法編寫規範,缺一不可,只要父類中有多少個,子類中都要定義上

import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass
    @abc.abstractmethod
    def eat(self):
        pass
    
class Dog(Animal):
    def speak(self):  # 遵循父類的speak
        print('汪汪汪~')
    def eat(self):  # 遵循父類的eat
        print('舔狗~')

 class Pig(Animal):
     def speak(self):  # 遵循父類的speak
         print('哼哼哼~')
     def chi(self):  # 未遵循父類的eat,則會報錯TypeError: Can't instantiate abstract class Pig with abstract methods eat
         print('嗯嗯嗯~')

class Cat(Animal):
    def speak(self):
        print('喵喵喵~')
    # 缺乏一個父類定義的規範會報錯
    # TypeError: Can't instantiate abstract class Cat with abstract methods eat

dog_obj = Dog()
# pig_obj = Pig()
dog_obj.speak()
# pig_obj.speak()
dog_obj.eat()
# pig_obj.chi()
cat_obj = Cat()

三、鴨子類型

一、什麼是鴨子類型

不一樣的對象,只要長得像鴨子,那它就是鴨子

二、爲何要有鴨子類型

耦合度低,程序可擴展性強

不一樣的對象,先抽象出相同類型的方法,給他們定製一套統一 規範,全部的類,在定義時都按照統一的規範進行編寫

注意:在python中推薦使用鴨子類型

# 抽象統必定製出一套規範,speak,eat
# 豬類
class Pig:
    def eat(self):
        print('bia唧...')

    def speak(self):
        print('哼哼哼...')


# 貓類
class Cat:
    def eat(self):
        print('咬ji 咬ji....')

    def speak(self):
        print('喵喵喵...')


# 狗類
class Dog:
    def eat(self):
        print('舔狗...')

    def speak(self):
        print('汪汪汪...')
# 由於都有speak和eat 因此能夠定義一個speak和eat函數能夠直接調用
dog = Dog()
pig = Pig()

def SPEAK(animal):
    animal.speak()

def EAT(animal):
    animal.eat()

SPEAK(pig)
EAT(dog)
相關文章
相關標籤/搜索