標籤:產生 16px data 步驟 地方 互動 基本 處理 小結
物件導向
-
- 面向過程
- 面向過程的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麼時候處理什麼東西。
- 優點: 極大的降低了寫程式的複雜度,只需要順著要執行的步驟,堆疊代碼即可
- 缺點: 一套流水線或者流程就是用來解決一個問題,代碼牽一髮而動全身
- 應用情境: 一旦完成基本很少改變的情境,著名的例子有Linux內核,git,以及Apache HTTP Server等
- 物件導向
- 物件導向的程式設計的核心是對象(上帝式思維)要理解對象為何物,必須把自己當成上帝,上帝眼裡世間存在的萬物皆為對象,不存在的也可以創造出來。物件導向的程式設計好比如來設計西遊記,如來要解決的問題是把經書傳給東土大唐,如來想了想解決這個問題需要四個人:唐僧,沙和尚,豬八戒,孫悟空,每個人都有各自的特徵和技能(這就是對象的概念,特徵和技能分別對應對象的屬性和方法),然而這並不好玩,於是如來又安排了一群妖魔鬼怪,為了防止師徒四人在取經路上被搞死,又安排了一群神仙保駕護航,這些都是對象。然後取經開始,師徒四人與妖魔鬼怪神仙互相纏鬥著直到最後取得真經。如來根本不會管師徒四人按照什麼流程去取
- 優點: 解決了程式的擴充性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特徵和技能修改都很容易
- 缺點: 可控性差,無法向面向過程的程式設計流水線式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由對象之間的互動解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡
- 應用情境: 求經常變化的軟體,一般需求的變化都集中在使用者層,互連網應用,企業內部軟體,遊戲等都是物件導向的程式設計大顯身手的好地方
- 初始類和對象
-
-
-
# 執行個體化的過程就是類——>對象的過程# 原本我們只有一個Person類,在這個過程中,產生了一個egg對象,有自己# 具體的名字、攻擊力和生命值。# 文法:對象名 = 類名(參數)egg = Person(‘egon‘) #類名()就等於在執行Person.__init__()#執行完__init__()就會返回一個對象。這個對象類似一個字典,存著屬於這個人本身的一些屬性和方法。#你可以偷偷的理解:egg = {‘name‘:‘egon‘,‘walk‘:walk}# 屬性調用print(egg.name) #查看屬性直接 對象名.屬性名稱print(egg.walk()) #調用方法,對象名.方法名()
- 類屬性的補充
一:我們定義的類的屬性到底存到哪裡了?有兩種方式查看dir(類名):查出的是一個名字列表類名.__dict__:查出的是一個字典,key為屬性名稱,value為屬性值二:特殊的類屬性類名.__name__# 類的名字(字串)類名.__doc__# 類的文檔字串類名.__base__# 類的第一個父類(在講繼承時會講)類名.__bases__# 類所有父類構成的元組(在講繼承時會講)類名.__dict__# 類的字典屬性類名.__module__# 類定義所在的模組類名.__class__# 執行個體對應的類(僅新式類中)
- 對象
- 對象是關於類而實際存在的一個例子,即執行個體
- 對象/執行個體只有一種作用:屬性引用
class Person: # 定義一個人類 role = ‘person‘ # 人的角色屬性都是人 def __init__(self, name, aggressivity, life_value): self.name = name # 每一個角色都有自己的暱稱; self.aggressivity = aggressivity # 每一個角色都有自己的攻擊力; self.life_value = life_value # 每一個角色都有自己的生命值; def attack(self,dog): # 人可以攻擊狗,這裡的狗也是一個對象。 # 人攻擊狗,那麼狗的生命值就會根據人的攻擊力而下降 dog.life_value -= self.aggressivit# 執行個體化egg = Person(‘egon‘,10,1000)# 引用print(egg.name) print(egg.aggressivity)print(egg.life_value)
- 物件導向小結
class 類名: def __init__(self,參數1,參數2): self.對象的屬性1 = 參數1 self.對象的屬性2 = 參數2 def 方法名(self):pass def 方法名2(self):pass對象名 = 類名(1,2) #對象就是執行個體,代表一個具體的東西 #類名() : 類名+括弧就是執行個體化一個類,相當於調用了__init__方法 #括弧裡傳參數,參數不需要傳self,其他與init中的形參一一對應 #結果返回一個對象對象名.對象的屬性1 #查看對象的屬性,直接用 對象名.屬性名稱 即可對象名.方法名() #調用類中的方法,直接用 對象名.方法名() 即可
- 對象之間的互動
-
- 例子
class Person: # 定義一個人類 role = ‘person‘ # 人的角色屬性都是人 def __init__(self, name, aggressivity, life_value): self.name = name # 每一個角色都有自己的暱稱; self.aggressivity = aggressivity # 每一個角色都有自己的攻擊力; self.life_value = life_value # 每一個角色都有自己的生命值; def attack(self,dog): # 人可以攻擊狗,這裡的狗也是一個對象。 # 人攻擊狗,那麼狗的生命值就會根據人的攻擊力而下降 dog.life_value -= self.aggressivityclass Dog: # 定義一個狗類 role = ‘dog‘ # 狗的角色屬性都是狗 def __init__(self, name, breed, aggressivity, life_value): self.name = name # 每一隻狗都有自己的暱稱; self.breed = breed # 每一隻狗都有自己的品種; self.aggressivity = aggressivity # 每一隻狗都有自己的攻擊力; self.life_value = life_value # 每一隻狗都有自己的生命值; def bite(self,people): # 狗可以咬人,這裡的狗也是一個對象。 # 狗咬人,那麼人的生命值就會根據狗的攻擊力而下降 people.life_value -= self.aggressivityegg = Person(‘egon‘,10,1000) #創造了一個實實在在的人eggha2 = Dog(‘二愣子‘,‘哈士奇‘,10,1000) #創造了一隻實實在在的狗ha2print(ha2.life_value) #看看ha2的生命值egg.attack(ha2) #egg打了ha2一下print(ha2.life_value) #ha2掉了10點血
python之物件導向