下面舉一個例子,同樣的代碼使用 python2 和 python3 寫的,大家注意兩段程序中紅色加粗的部分:
python2的類繼承使用super方法:
1 #-*- coding:utf-8 -*- 2 ''' 3 Created on 2018年8月27日 4 5 @author: anyd 6 ''' 7 import random as r 8 9 class Fish(object): 10 def __init__(self): 11 self.x = r.randint(0, 10) 12 self.y = r.randint(0, 10) 13 14 def move(self): 15 #這里主要演示類的繼承機制,就不考慮檢查場景邊界和移動方向的問題 16 #假設所有魚都是一路向西游 17 self.x -= 1 18 print "我的位置是:", self.x, self.y 19 20 class Goldfish(Fish): 21 pass 22 23 class Carp(Fish): 24 pass 25 26 class Salmon(Fish): 27 pass 28 29 #上邊幾個都是食物,食物不需要有個性,所以直接繼承Fish類的全部屬性和方法即可 30 #下邊定義鯊魚類,這個是吃貨,除了繼承Fish類的屬性和方法,還要添加一個吃的方法 31 32 class Shark(Fish): 33 def __init__(self): 34 super(Shark,self).__init__() 35 self.hungry = True 36 37 def eat(self): 38 if self.hungry: 39 print "吃貨的夢想就是天天有的吃^_^" 40 self.hungry = False 41 else: 42 print "太撐了,吃不下了!" 43 44 aa = Shark() 45 aa.move()
輸出如下:
我的位置是: 8 2
python3的類繼承使用super方法:
1 #-*- coding:utf-8 -*- 2 ''' 3 Created on 2018年8月27日 4 5 @author: anyd 6 ''' 7 import random as r 8 9 class Fish(object): 10 def __init__(self): 11 self.x = r.randint(0, 10) 12 self.y = r.randint(0, 10) 13 14 def move(self): 15 #這里主要演示類的繼承機制,就不考慮檢查場景邊界和移動方向的問題 16 #假設所有魚都是一路向西游 17 self.x -= 1 18 print ("我的位置是:", self.x, self.y) 19 20 class Goldfish(Fish): 21 pass 22 23 class Carp(Fish): 24 pass 25 26 class Salmon(Fish): 27 pass 28 29 #上邊幾個都是食物,食物不需要有個性,所以直接繼承Fish類的全部屬性和方法即可 30 #下邊定義鯊魚類,這個是吃貨,除了繼承Fish類的屬性和方法,還要添加一個吃的方法 31 32 class Shark(Fish): 33 def __init__(self): 34 super().__init__() 35 self.hungry = True 36 37 def eat(self): 38 if self.hungry: 39 print ("吃貨的夢想就是天天有的吃^_^") 40 self.hungry = False 41 else: 42 print ("太撐了,吃不下了!") 43 44 aa = Shark() 45 aa.move()
輸出如下:
我的位置是: 7 4
super方法具體使用注意事項可以參考官方的指導文檔,里面有詳細的使用例子,但個人覺得這種super方法不太容易讓人看得舒服,個人比較偏好采用未綁定的方法來寫,這樣就不管是python2 還是 python3,都是沒有問題的。如下:
1 class Shark(Fish): 2 def __init__(self): 3 Fish.__init__(self) 4 self.hungry = True