1. 程式人生 > 其它 >python學習(10)繼承、多型、實戰

python學習(10)繼承、多型、實戰

繼承

一、Java與Python的繼承區別:

1、Python是一個類可以繼承N個類

2、Java只能繼承一個類

 

二、概念:

1、基類(父類):被繼承的類

2、派生類(子類):繼承其他類的類

 

  • 如果一個類沒有繼承任何類,則預設繼承object

  • Python支援多繼承

  • 定義子類時,必須在其建構函式中呼叫父類的建構函式

三、格式:

class    子類類名(父類):
  (構造方法中呼叫父類的構造方法)

 

四、子類繼承父類,繼承了什麼?

繼承了父類的:(資料屬性、例項屬性、方法)

1、資料屬性

2、例項屬性

方法1:  super().__init__(name,age)       
方法2: 父類名.__init__(self,name,age)

 

3、方法

在子類中呼叫父類的方法,因為要用到這個方法裡的內容,子類呼叫後對這個方法要進行重寫(或者說要對這個方法進行運用),所以這個父類方法要有return返回值。

 

五、方法重寫:

當父類的方法沒有辦法滿足子類的需求的時候,那麼子類就會重寫了父類的方法。

 

六、繼承的原則:

(簡單來說,從左到右、從上到下的實踐方法其實也是遵循的MRO原理,是從mro中總結出來的,根本上的順序就是mro的輸出結果。說白了就是先找自己、再從左到右找(因為是線性查詢,自己重寫了父類的方法就從自己這兒找到了,自己沒重寫的話,就是從左到右找)。

原理:

在Python中,基於MRO的解析順序規則,就會從左到右開始查詢基類,如果找到第一個匹配的屬性類,就會停止查詢,如果沒有,那麼就繼續查詢,直到查詢到如何要求的為止。MRO其實就是通過一個C3線性化演算法來實現的,它的核心思想為:

1、子類會優先於父類檢查

2、多個父類會根據它們在列表中的順序被依次檢查(如下圖mro輸出的列表,也就是從左到右)

3、如果對下一個類存在兩個合法的選擇,只能選擇第一個

 

 

實踐:

1、從左到右

(父類中寫在左邊的,優先於寫在右邊的,如下圖的Father優先於Mother)

前提條件:子類沒重寫父類的方法

原則:線性查詢的順序規則,也就是說呼叫方法,如果找到第一個滿足的方法,後面繼承的類即使有這個方法,也不會呼叫。

 1 class Father(object):
 2     def __init__(self,salary):
 3         self.salary=salary
4 5 @property 6 def getSalary(self): 7 return self.salary 8 9 def show(self): 10 print("男人賺錢") 11 12 class Mother(object): 13 def __init__(self,hobby): 14 self.hobby=hobby 15 def show(self): 16 print("女人花錢") 17 18 class Son(Father,Mother): 19 def __init__(self,salary,hobby): 20 Father.__init__(self,salary) 21 Mother.__init__(self,hobby) 22 23 obj=Son(salary=10,hobby="讀書") 24 # obj.show() 25 print(Son.mro())
View Code

 

2、從下到上

前提條件:子類重寫了父類的方法。

原則:線性查詢的順序規則,呼叫父類以及子類共同擁有的方法的時候,優先呼叫子類自己寫的方法。

 

 1 class Animal(object):
 2     address="地球"
 3 
 4     def __init__(self,name,age):
 5         self.name=name
 6         self.age=age
 7 
 8     def show(self):
 9         return "name is {0},age is {1}".format(self.name,self.age)
10 
11 class Person(Animal):
12     def __init__(self,name,age,work):
13         super().__init__(name,age)        #子類繼承父類的例項屬性 方式1
14         Animal.__init__(self,name,age)    #子類繼承父類的例項屬性 方式2
15         self.work=work
16 
17     def info(self):
18         print("來自{0},資訊:{1}".format(self.address,self.show()))
19 
20     def show(self):
21         print("我我我我")
22 
23 obj=Person(name="j",age=18,work="測試")
24 obj.show()
View Code

 

 報錯:

 

 

多型

多型的優勢具體可以總結為如下幾點,具體為:

  • 增加了持續的靈活性

  • 增加了持續的額外擴充套件的功能

一、主函式:

主函式(統一執行程式)下可以執行函式或方法,敲main就會出來:

使用:

二、多型:萬物皆可物件

func函式定義了這個方法,給函式賦值,值屬於哪一類中,就呼叫哪個方法

 

oop實戰:

oop:面向物件

 

 1 import json
 2 import sys
 3 
 4 class Stack(object):
 5     def out(self):
 6         username=input("請輸入你的賬戶:\n")
 7         password=input("請輸入你的密碼:\n")
 8         return username,password                 #類似封裝,在下面呼叫就行,下面的程式碼會更簡潔
 9 
10     def register(self):
11         username,password=self.out()
12         temp=username+","+password
13         json.dump(temp,open("data.txt","w"))           #檔案序列化:相當於下面兩行程式碼(把內容寫入檔案)
14         # with open("data.txt","w") as f:
15         #     f.write(temp)
16 
17     def login(self):
18         username, password=self.out()
19         lists=str(json.load(open("data.txt"))).split(",")   #檔案反序列化:相當於下面兩行程式碼
20         # with open("data.txt","r") as f:
21         #     lists=f.read().split(",")
22         if username==lists[0] and password==lists[1]:
23             print( "恭喜你,登入成功!")
24         else:
25             print( "請輸入正確的使用者名稱和密碼")
26 
27     def profile(self):
28         with open("data.txt","r") as f:
29             lists=f.read().split(",")
30             print("歡迎{0}訪問主頁".format(lists[0]))
31 
32     def exit(self):
33         sys.exit(1)
34 
35     def main(self):
36         while True:
37             try:
38                 f=int(input("1、註冊 2、登入 3、主頁 4、退出\n"))
39                 if f==1:
40                     self.register()
41                 elif f==2:
42                     self.login()
43                 elif f==3:
44                     self.profile()
45                 elif f==4:
46                     self.exit()
47                 else:continue
48             except Exception as e:continue
49 
50 if __name__ == '__main__':
51     obj=Stack()
52     obj.main()
View Code