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)
在子類中呼叫父類的方法,因為要用到這個方法裡的內容,子類呼叫後對這個方法要進行重寫(或者說要對這個方法進行運用),所以這個父類方法要有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=salaryView Code4 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())
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