1. 程式人生 > >菜鳥學python第二十四天(面向物件三大特性之多型)

菜鳥學python第二十四天(面向物件三大特性之多型)

面向物件三大特性之多型

  • 什麼是多型

    不同物件響應同一種方法的表現出不同的行為,產生不同的結果

    用基類建立一套統一的規則,強制子類去遵循(使用抽象類實現),這樣便可以 在不用考慮物件具體型別的前提下而直接使用物件下的方法

  • 為什麼要有多型

    1. 增加了程式的靈活性

      以不變應萬變,不論物件千變萬化,使用者都是以同一種形式去呼叫,如func(animal)

    2. 提高程式的拓展性

      通過繼承animal類建立了一個新的類,使用者無需更改自己的程式碼,還是用func(animal)去呼叫  

  • 怎麼用多型

    讓幾個不同的類擁有相同的父類,繼承了相同的方法,然後重新定義其方法,這樣用相同的方法就能產生不同的結果.

class Animal:
    def eat(self):
        print('動物在吃草')
​
​
class Person(Animal):
    def eat(self):  # 定義人的方法
        print('人吃糧食...')
​
​
class Pig(Animal):
    def eat(self):  # 定義豬的方法
        print('豬吃飼料...')
​
​
class Dog(Animal):
    def eat(self):  #定義狗的方法
        print('狗吃骨頭...')
​
#
產生物件 person = Person() pig = Pig() dog = Dog() ​ ​ # 呼叫不同物件的同一方法,產生不同結果(多型性的體現) peo.talk() dog.talk() pig.talk() ​ ​ def func(animal): # 可以進一步封裝成一個介面,傳入什麼物件就呼叫它的方法 animal.eat() ​ ​ func(pig) ​
  • abc模組

    abstract的縮寫 ,抽象的意思

    • 使用ABC模組的步驟

      1. 為類中指定元類為metaclass = abc.ABCMeta

      2. 在相應的方法上加上@abc.abstractmethod

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一類事物:動物
        @abc.abstractmethod
        def talk(self):
            passclass 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 aoao')
            
            
    # 使用ABC裝飾器的目的,將基類變為抽象基類,嚴格要求子類物件必須使用基類中被裝飾的的方法,如果子類中沒有該方法則報錯.

     

  • 鴨子型別

    • 在現實中一個物體叫聲象鴨子,走路也像鴨子,那麼人們就把它當做鴨子

    • 對應到程式設計中就是兩個獨立的類,沒有任何關聯,但是兩者的方法和 屬性都一致(長得像),那麼兩者就可以實現多型(不同物件響應同一種方法的表現出不同的行為,產生不同的結果).這就是鴨子型別.

# 類Foo和Bar都擁有兩種相同的方法,故兩者稱之為鴨子型別
class Foo:
    def f1(self):
        print('from foo.f1')
​
    def f2(self):
        print('from foo.f2')
​
​
class Bar:
    def f1(self):
        print('from bar.f1')
​
    def f2(self):
        print('from bar.f2')
​
​
obj1 = Foo()
obj2 = Bar()
​
# (obj1,obj2)不同物件針對同一方法(f1)產生不同的結果
obj1.f1()
obj2.f1()
#  (obj1,obj2)不同物件針對同一方法(f2)產生不同的結果
obj1.f2()
obj2.f2()