Python面向對象之多態


多態

面向對象三大特性

封裝 根據職責將屬性和方法封裝到一個抽象的類中;--定義類的准則
繼承 實現代碼的重用,相同的代碼不需要重復的編寫;--設計類的技巧;子類針對自己的需求,編寫特定的代碼;
多態 不同的子類對象調用相同的父類方法,產生不同的執行結果;--

  • 多態可以增加代碼的靈活度;
  • 以繼承和重寫父類方法為前提;
  • 是調用方法的技巧,不會影響到類的內部設計;

例如同樣是人類,就有醫生和教師的工作職別。

多態案例演練

需求:在Dog類中封裝方法game,普通狗類只是簡單的玩耍;
定義軍犬類繼承自Dog,重寫game方法,軍犬可以接飛盤;
定義Person類,並且封裝一個和狗玩的方法,在方法內部,直接讓狗對象調用game方法。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s 跳來跳去" % self.name)


class ArmyDog(Dog):
    def game(self):
        print("%s 跑去接飛盤" % self.name)


class Person(object):
    def __init__(self, name):
        self.name = name

    def play_with_dog(self, dog):
        print("%s play with %s" % (self.name, dog.name))
        dog.game()


# bagong = Dog("八公")  # 小明 play with 八公  八公 跳來跳去
bagong = ArmyDog("八公")  # 小明 play with 八公  八公 跑去接飛盤

xiaoming = Person("小明")

xiaoming.play_with_dog(bagong)

Person類中只需要讓狗對象調用game方法,而不關心具體是什么狗;game方法是在Dog父類中定義的;
在程序執行時,傳入不同的狗對象實參,就會產生不同的執行結果。

多態他解

多態的概念是應用於Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。

所謂多態:定義時的類型和運行時的類型不一樣,此時就成為多態。

多態,同一個對象,多種形態。python默認支持多態。
多態: 同⼀個對象, 多種形態. 這個在python中其實是很不容易說明⽩的. 因為我們⼀直在⽤. 只是沒有具體的說. 比如. 我們創建⼀個變量a = 10 , 我們知道此時a是整數類型. 但是我們可以通過程序讓a = "alex", 這時, a⼜變成了字符串類型. 這是我們都知道的. 但是, 我要告訴你的是. 這個就是多態性. 同⼀個變量a可以是多種形態。

Python偽代碼實現Java或C#的多態

class F1(object):
    def show(self):
        print 'F1.show'

class S1(F1):
    def show(self):
        print 'S1.show'

class S2(F1):
    def show(self):
        print 'S2.show'

# 由於在Java或C#中定義函數參數時,必須指定參數的類型
# 為了讓Func函數既可以執行S1對象的show方法,又可以執行S2對象的show方法,所以,定義了一個S1和S2類的父類
# 而實際傳入的參數是:S1對象和S2對象

def Func(F1 obj):
    """Func函數需要接收一個F1類型或者F1子類的類型"""

    print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函數中傳入S1類的對象 s1_obj,執行 S1 的show方法,結果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函數中傳入Ss類的對象 ss_obj,執行 Ss 的show方法,結果:S2.show

Python “鴨子類型”

class F1(object):
    def show(self):
        print 'F1.show'

class S1(F1):

    def show(self):
        print 'S1.show'

class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM