你如今是一家遊戲公司的開發人員,如今須要你開發一款叫作<人狗大戰>的遊戲,你就思考呀,人狗做戰,那至少須要2個角色,一個是人,一個是狗,且人和狗都有不一樣的技能,好比人拿棍打狗, 狗能夠咬人,怎麼描述這種不一樣的角色和他們的功能呢?你搜羅了本身掌握的全部技能,寫出了下面的代碼來描述這兩個角色python
def hero(name,sex,hp,ce,level=2,exp=2000,money=10000): hero_info = { 'name':name, 'sex':sex, 'hp':hp, # 血值 'ce':ce, # 戰鬥力 "level":level, # 級別 "exp":exp, # 經驗 "money":money # 金幣 } return hero_info def dog(name,dog_type,hp,ce): dog_info = { 'name':name, 'dog_type':dog_type, 'hp':hp, 'ce':ce, } return dog_info def bite(dog,hero): print("%s咬了%s"%(dog["name"],hero["name"])) def attack(hero,dog): print("%s攻擊了%s"%(hero["name"],dog["name"])) alex=hero("alex","male",100,80) xiaohei=dog("小黑","藏獒",100,5) # 可是方法之間沒有關聯性,就會出現以下問題 bite(alex,xiaohei) # alex咬了小黑,這alex真牛逼,誰都敢咬
def hero(name,sex,hp,ce,level=2,exp=2000,money=10000): hero_info = { 'name':name, 'sex':sex, 'hp':hp, # 血值 'ce':ce, # 戰鬥力 "level":level, # 級別 "exp":exp, # 經驗 "money":money # 金幣 } def attack(dog): print("%s攻擊了%s"%(hero_info["name"],dog["name"])) hero_info["attack"]=attack return hero_info def dog(name,dog_type,hp,ce): dog_info = { 'name':name, 'dog_type':dog_type, 'hp':hp, 'ce':ce, } def bite(hero): print("%s咬了%s"%(dog_info["name"],hero["name"])) dog_info["bite"]=bite # 閉包 return dog_info alex=hero("alex","male",100,80) xiaohei=dog("小黑","藏獒",100,5)
面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象做爲程序的基本單元,一個對象包含了數據和操做數據的函數。git
面向過程的程序設計把計算機程序視爲一系列的命令集合,即一組函數的順序執行。爲了簡化程序設計,面向過程把函數繼續切分爲子函數,即把大塊函數經過切割成小塊函數來下降系統的複雜度。程序員
舉例:把大象裝進冰箱須要三步: 編程
面向過程的程序設計閉包
面向過程的程序設計的核心是過程(流水線式思惟), 過程即解決問題的步驟,面向過程的設計就比如精心設計好一條流水線,考慮周全何時處理什麼東西。函數
優勢是:極大的下降了寫程序的複雜度,只須要順着要執行的步驟,堆疊代碼便可。this
缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一髮而動全身。spa
應用場景:一旦完成基本不多改變的場景,著名的例子有Linux內核,git,以及Apache HTTP Server等。設計
面向對象的程序設計code
優勢是:解決了程序的擴展性。對某一個對象單獨修改,會馬上反映到整個體系中,如對遊戲中一我的物參數的特徵和技能修改都很容易。
缺點:可控性差,沒法向面向過程的程序設計流水線式的能夠很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即使是上帝也沒法預測最終結果。
應用場景:需求常常變化的軟件,通常需求的變化都集中在用戶層,互聯網應用,企業內部軟件,遊戲等都是面向對象的程序設計大顯身手的好地方。
在python 中面向對象的程序設計並非所有。
面向對象編程可使程序的維護和擴展變得更簡單,而且能夠大大提升程序開發效率 ,另外,基於面向對象的程序可使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。
其實,上帝就是一個程序員,基於面向對象的思想創造了世界萬物。
# 函數聲明 def 函數名(args): 函數體 # 聲明一個類 class 類名: 類變量=值 def 實例方法(self,*args,**kwargs): pass # 示例 class Dog: legs=4 # 類變量 def __init__(self,name,type): # 類必不可少的方法,用於實例化 self.name=name self.type=type def bite(self): # 根據Dog類自定義的實例方法 print("bite...")
注意,__init__()方法是一種特殊的方法,被稱爲類的構造函數或初始化方法,當建立了這個類的實例時就會調用該方法
實例化的過程就是由類建立具體對象的過程。
alex=Dog("alex","藏獒") egon=Dog("egon","京巴")
注意類與對象的內存的存儲關係!
self表明類的實例,而非類。類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
class Dog: legs=4 # 類變量 def __init__(self,name,type): # 類必不可少的方法,用於實例化 self.name=name self.type=type def bite(self): # 根據Dog類自定義的實例方法 print("bite...") print("self",self) alex=Dog("alex","藏獒") alex.bite() print("alex",alex)
從執行結果能夠很明顯的看出,self 表明的是類的實例,表明當前對象的地址。self 不是 python 關鍵字,咱們把他換成 this 或者其餘任何單詞也是能夠正常執行的。
class Hero: def __init__(self,name,sex,hp,ce,level=2,exp=2000,money=10000): # 類必不可少的方法,用於實例化 self.name=name self.sex=sex self.hp=hp self.ce=ce self.level=level self.exp=exp self.money=money alex=Hero("alex","male",100,80) # 查看屬性 print(alex.sex) print(alex.money) # 添加一個屬性(實例變量) alex.age=1000 # 修改屬性 alex.age=999 # 刪除屬性 del alex.age
注意實例對象有一個__dict__的屬性,能夠打印下看看是什麼。
好了如今咱們能夠基於Python的類來實現咱們的人狗大戰了!
其實,咱們使用的全部數據都是具體類的實例對象,好比str,list等等。
軟件重用的重要方式除了繼承以外還有另一種方式,即:組合。組合指的是,在一個類中以另一個類的對象做爲數據屬性,稱爲類的組合
class Weapon: def __init__(self,name,av,color): self.name=name self.av=av self.color=color gun=Weapon("激光槍",100,"red") class Hero: def __init__(self,name,sex,hp,ce,weapon,level=2,exp=2000,money=10000): # 類必不可少的方法,用於實例化 self.name=name self.sex=sex self.hp=hp self.ce=ce self.level=level self.exp=exp self.money=money self.weapon=weapon alex=Hero("alex","male",100,80,gun) print(alex.weapon.color)