python 面向對象的初識
一.楔子
你現在是一家遊戲公司的開發人員,現在需要你開發一款叫做<人狗大戰>的遊戲,你就思考呀,人狗作戰,那至少需要2個角色,一個是人, 一個是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎麽描述這種不同的角色和他們的功能呢?
def person(name,sex,aggr,hp): #人模子 dic_person = {‘name‘:name,‘sex‘:sex,‘aggr‘:aggr,‘hp‘:hp} def attack(dog): dog[‘hp‘] -= dic_person[‘aggr‘] print(‘%s打了%s,%s剩下%s血‘%(dic_person[‘name‘],dog[‘name‘],dog[‘name‘],dog[‘hp‘])) dic_person[‘attack‘] = attack return dic_person def dog(name,kind,aggr,hp): #狗模子 dic_dog = {‘name‘:name,‘kind‘:kind,‘aggr‘:aggr,‘hp‘:hp} def bite(person): person[‘hp‘] -= dic_dog[‘aggr‘] print(‘%s打了%s,%s剩下%s血‘ % (dic_dog[‘name‘], person[‘name‘], person[‘name‘], person[‘hp‘])) dic_dog[‘bite‘] = bite return dic_dog hei = dog(‘小黑‘,‘teddy‘,260,10000) alex = person(‘alex‘,‘female‘,1,250) alex[‘attack‘](hei) hei[‘bite‘](alex) alex[‘attack‘](hei) hei[‘bite‘](alex) # alex打了小黑,小黑剩下9999血 # 小黑打了alex,alex剩下-10血# alex打了小黑,小黑剩下9998血 # 小黑打了alex,alex剩下-270血
二.面向對象與面向過程的比較:
面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麽時候處理什麽東西。
優點是:極大的降低了寫程序的復雜度,只需要順著要執行的步驟,堆疊代碼即可。
缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一發而動全身。
應用場景:一旦完成基本很少改變的場景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向對象的程序設計的核心是對象(上帝式思維),要理解對象為何物,必須把自己當成上帝,上帝眼裏世間存在的萬物皆為對象,不存在的也可以創造出來
優點是:解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特征和技能修改都很容易。
缺點:可控性差,無法向面向過程的程序設計流水線式的可以很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。
應用場景:需求經常變化的軟件,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟件,遊戲等都是面向對象的程序設計大顯身手的好地方。
了解一些名詞:類、對象、實例、實例化
類:具有相同特征的一類事物(人、狗、老虎)
對象/實例:具體的某一個事物(隔壁阿花、樓下旺財)
實例化:類——>對象的過程(這在生活中表現的不明顯,我們在後面再慢慢解釋)
三.初識類和對象
python中一切皆為對象,類型的本質就是類,所以,不管你信不信,你已經使用了很長時間的類了
類有兩種方法:屬性應用和實例化
屬性應用(類.屬性)
class Person: #定義一個人類 role = ‘person‘ #人的角色屬性都是人 def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,註意,這裏不是在調用 # person # <function Person.walk at 0x0000021834A78B70>
實例化:類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征
原本我們只有一個Person類,在這個過程中,產生了一個egg對象,有自己具體的名字、攻擊力和生命值。
語法:對象名 = 類名(參數)
python 面向對象的初識