python全棧開發-面向物件-初識 python_16_day
函式總結:
面向過程的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麼時候處理什麼東西。
優點是:極大的降低了寫程式的複雜度,只需要順著要執行的步驟,堆疊程式碼即可。
缺點是:一套流水線或者流程就是用來解決一個問題,程式碼牽一髮而動全身。
應用場景:一旦完成基本很少改變的場景,著名的例子有Linux核心,git,以及Apache HTTP Server等。
面向物件的程式設計的核心是物件(上帝式思維),要理解物件為何物,必須把自己當成上帝,上帝眼裡世間存在的萬物皆為物件,不存在的也可以創造出來。面向物件的程式設計好比如來設計西遊記,如來要解決的問題是把經書傳給東土大唐,如來想了想解決這個問題需要四個人:唐僧,沙和尚,豬八戒,孫悟空,每個人都有各自的特徵和技能(這就是物件的概念,特徵和技能分別對應物件的屬性和方法),然而這並不好玩,於是如來又安排了一群妖魔鬼怪,為了防止師徒四人在取經路上被搞死,又安排了一群神仙保駕護航,這些都是物件。然後取經開始,師徒四人與妖魔鬼怪神仙互相纏鬥著直到最後取得真經。如來根本不會管師徒四人按照什麼流程去取。
面向物件的程式設計的
優點是:解決了程式的擴充套件性。對某一個物件單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物引數的特徵和技能修改都很容易。
缺點:可控性差,無法向面向過程的程式設計流水線式的可以很精準的預測問題的處理流程與結果,面向物件的程式一旦開始就由物件之間的互動解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一引數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。
應用場景:需求經常變化的軟體,一般需求的變化都集中在使用者層,網際網路應用,企業內部軟體,遊戲等都是面向物件的程式設計大顯身手的好地方。
在python 中面向物件的程式設計並不是全部。
面向物件程式設計可以使程式的維護和擴充套件變得更簡單,並且可以大大提高程式開發效率 ,另外,基於面向物件的程式可以使它人更加容易理解你的程式碼邏輯,從而使團隊開發變得更從容。
瞭解一些名詞:類、物件、例項、例項化
類:具有相同屬性和技能的一類事物. 人類: 物件: 具體的類的表現,具體的實實在在的一個例項 人是一類,某個人是一個物件. 狗是一類,我家養的旺財是一個物件.
例項化:類——>物件的過程
1 class Person: 2 '''類體:兩部分:變數部分,方法(函式)部分''' 3 mind = '有思想' # 變數,靜態變數,靜態欄位 4 animal = '高階動物' 5 faith = '有信仰' 6 def __init__(self): 7 print(self) 8 print(666) 9 def work(self): # 方法,函式,動態變數 10 print(self) 11 print('人類都會工作...') 12 def shop(self): 13 print('人類可以消費....') 14 15 # 類名的角度 16 # 操作類中的靜態變數 17 # 1, Person.__dict__ 查詢類中的所有的內容 (不能進行增刪改操作) 18 print(Person.__dict__) 19 print(Person.__dict__['faith']) 20 Person.__dict__['mind'] = '無腦' 21 print(Person.__dict__['mind']) 22 # 2, 萬能的 . 對類中的單個的變數進行增刪改查,用 萬能的 點 23 print(Person.mind) 24 print(Person.animal) # 查 25 Person.money = '運用貨幣' # 增 26 Person.mind = '無腦的' # 改 27 del Person.mind 28 print(Person.__dict__) 29 30 #操作類中的方法 (工作中基本不用類名去操作) 31 Person.work(111) 32 33 # 物件的角度 34 ret = Person() # 類名+()的這個過程:例項化的過程(建立一個物件的過程), 35 # Person() 例項化物件,例項,物件. 36 print(ret) 37 #1,只要類名+() 產生一個物件,自動執行類中的__init__方法.
作業:
1,完成下列功能: 1.1建立一個人類Person,再類中建立3個靜態變數(靜態欄位) animal = '高階動物' soul = '有靈魂' language = '語言' 1.2在類中定義三個方法,吃飯,睡覺,工作. 1.3在此類中的__init__方法中,給物件封裝5個屬性:國家,姓名,性別,年齡,身高. 1.4例項化四個人類物件: 第一個人類物件p1屬性為:中國,alex,未知,42,175. 第二個人類物件p2屬性為:美國,武大,男,35,160. 第三個人類物件p3屬性為:你自己定義. 第四個人類物件p4屬性為:p1的國籍,p2的名字,p3的性別,p2的年齡,p3 的身高. 1.5 通過p1物件執行吃飯方法,方法裡面列印:alex在吃飯. 1.6 通過p2物件執行吃飯方法,方法裡面列印:武大在吃飯. 1.7 通過p3物件執行睡覺方法,方法裡面列印:(p3物件自己的名字)在吃飯. 1.8 通過p1物件找到Person的靜態變數 animal 1.9 通過p2物件找到Person的靜態變數 soup 2.0 通過p3物件找到Person的靜態變數 language
1 class Person: 2 animal = '高階動物' 3 soul = '有靈魂' 4 language = '語言' 5 6 def __init__(self, country, name, sex, age, height): 7 self.country = country 8 self.name = name 9 self.sex = sex 10 self.age = age 11 self.height = height 12 13 def eat(self): 14 return "%s在吃飯" % self.name 15 16 def sleep(self): 17 return '%s在睡覺' % self.name 18 19 def work(self): 20 return '%s在工作' % self.name 21 22 23 p1 = Person("中國", 'alex', '未知', 42, 175) 24 p2 = Person("美國", '武大', '男', 35, 160) 25 p3 = Person('中國', 'corn', '男', 21, 178) 26 p4 = Person(p1.country, p2.name, p3.sex, p2.age, p3.height) 27 28 print(p1.eat()) 29 print(p2.eat()) 30 print(p3.eat()) 31 32 print(p1.animal) 33 print(p2.soul) 34 print(p3.language)
2,通過自己建立類,例項化物件 在終端輸出如下資訊 小明,10歲,男,上山去砍柴 小明,10歲,男,開車去東北 小明,10歲,男,最愛大保健 老李,90歲,男,上山去砍柴 老李,90歲,男,開車去東北 老李,90歲,男,最愛大保健 老張…
1 class Hobby: 2 3 def __init__(self,name,age,sex): 4 self.name = name 5 self.age = age 6 self.sex = sex 7 def hobby1(self): 8 return('%s,%s歲,%s,上山去砍柴' % (self.name,self.age,self.sex)) 9 def hobby2(self): 10 return('%s,%s歲,%s,開車去東北' % (self.name,self.age,self.sex)) 11 def hobby3(self): 12 return('%s,%s歲,%s,最愛大保健' % (self.name,self.age,self.sex)) 13 14 p1 = Hobby("小明",10,'男') 15 p2 = Hobby('老李',90,'男') 16 17 print(p1.hobby1()) 18 print(p1.hobby2()) 19 print(p1.hobby3()) 20 print(p2.hobby1()) 21 print(p2.hobby2()) 22 print(p2.hobby3())
3,模擬英雄聯盟寫一個遊戲人物的類(升級題). 要求: (1)建立一個 Game_role的類. (2) 構造方法中給物件封裝name,ad(攻擊力),hp(血量).三個屬性. (3) 建立一個attack方法,此方法是例項化兩個物件,互相攻擊的功能: 例: 例項化一個物件 蓋倫,ad為10, hp為100 例項化另個一個物件 劍豪 ad為20, hp為80 蓋倫通過attack方法攻擊劍豪,此方法要完成 '誰攻擊誰,誰掉了多少血, 還剩多少血'的提示功能.
1 class Game_role: 2 3 def __init__(self,name,ad,hp): 4 self.name = name 5 self.ad = ad 6 self.hp = hp 7 def attack(self,vicitm): 8 vicitm.hp = vicitm.hp - self.ad 9 print( "%s攻擊%s,%s掉了%s血,還剩%s血" % (self.name, vicitm.name, vicitm.name, self.ad, vicitm.hp)) 10 p1 = Game_role("蓋倫",10,100) 11 p2 = Game_role('劍豪',20,80) 12 13 p1.attack(p2) 14 print(p2.hp)