1. 程式人生 > 實用技巧 >Python21基礎 多型性

Python21基礎 多型性

  1 #多型性
  2 
  3 #多型的概念
  4 #發生多型的兩個前提條件
  5 #   1.繼承,多型一定發生在父類與子類之間
  6 #   2.重寫,子類重寫父類的方法
  7 #簡單來說
  8 #多型就是在多個子類繼承了同一個父類後
  9 #重構父類的方法,然後同樣的方法在不同類中存在不同的形式
 10 #這就是多型
 11 
 12 class animals(object):
 13     def put_s(self):
 14         print("動物")
 15 
 16 class dog(animals):
 17     def put_s(self):
18 print("狗哥") 19 20 class cat(animals): 21 def put_s(self): 22 print("貓哥") 23 24 a1=animals() 25 a2=dog() 26 a3=cat() 27 28 a1.put_s() 29 a2.put_s() 30 a3.put_s() 31 #這裡呼叫了方法put_s,但是三個方法輸出結果都是不一樣的 32 #這裡就存在多型 33 34 #一般來講,Python是動態面嚮物件語言,多型的意義不是像Java靜態語言那樣重要 35
36 print("//////////////////////////////") 37 38 #型別檢查 39 #其實不論多型對Python來說有多重要 40 #多型總是存在 41 #這裡我們可以對其進行檢查 42 #通過使用isinstance(object,classinfo)函式來檢查 43 # isinstance(object,classinfo)中 44 # 是檢查object例項,注意,object是例項!!!!!! 45 # 是否由classinfo類或者其子類創造 46 47 #依然拿上面的三個類做例子 48 ''' 49 class animals(object): 50 def put_s(self):
51 print("動物") 52 53 class dog(animals): 54 def put_s(self): 55 print("狗哥") 56 57 class cat(animals): 58 def put_s(self): 59 print("貓哥") 60 61 a1=animals() 62 a2=dog() 63 a3=cat() 64 65 ''' 66 print(isinstance(a1,dog)) 67 #判斷,a1例項是不是由dog類創造 68 print(isinstance(a2,dog)) 69 #判斷,a2例項是不是由dog類創造 70 print(isinstance(a3,dog)) 71 #判斷,a3例項是不是由dog類創造 72 print(isinstance(a3,animals)) 73 #判斷,a3例項是不是由animals類創造 74 75 #嘗試 76 #在寫isinstance(obj,class_or_tuple) 77 #我們發現函式說明中顯示可以用來檢測元組 78 #於是我們嘗試一下 79 80 t1=(0,1,2,3,4) 81 #print(isinstance(2,t1)) 82 #報錯,原因是2是int而不是一個例項 83 t2=2 84 #print(isinstance(t2,t1)) 85 #isinstance() arg 2 must be a type or tuple of types 86 #任然報錯 87 #這裡的她t2依然是以int型別存在 88 89 #換一種思路,就是元組裡面可以存放類嗎? 90 t3=(animals,dog,cat) 91 #編譯執行可以的 92 print(isinstance(a2,t3)) 93 # 判斷dog()例項a2是不是在這這個元組中的三個不同類或者其子類創造 94 95 print("//////////////////////////////////") 96 97 #鴨子型別 98 #""一隻鳥,走起來像鴨子,遊起來像鴨子,那他就是一隻鴨子"" 99 #簡單來說,鴨子型別不在乎變數的型別,只在乎變數所具有的方法 100 #鴨子型別像多型一樣工作,但是沒有繼承,只有像鴨子一樣的行為,就是方法 101 102 #還是拿上面的三個類舉例子 103 ''' 104 class animals(object): 105 def put_s(self): 106 print("動物") 107 108 class dog(animals): 109 def put_s(self): 110 print("狗哥") 111 112 class cat(animals): 113 def put_s(self): 114 print("貓哥") 115 116 a1=animals() 117 a2=dog() 118 a3=cat() 119 120 ''' 121 #定義一個鴨子型別 122 def duck(sth): #接收一個數據 123 #不論是什麼型別的 124 sth.put_s() 125 #直接執行這個資料的方法 126 #這說明只要滿足 127 #就會執行,不用去考慮是不是繼承形成多型 128 129 duck(animals()) 130 duck(dog()) 131 duck(cat()) 132 133 print("///////////////////////////")