一、面向過程:面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什么時候處理什么東西。
優點:極大地降低了寫成學的復雜度,只需要順着執行的步驟,堆疊代碼即可
缺點:一套流水線或者流程就是用來解決一個問題,如果修改代碼就都得改變
二、面向對象:上帝的思想
優點:解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對游戲中一個人物參數的特征和技能修改都很容易。
缺點:可控性差,無法向面向過程的程序設計流水線式的可以很精准的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個游戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個游戲就失去平衡。
三、類:是具有相同特征的一類事物(人,狗,老虎)
對象/實例:具體的某一事物
實例化:類到對象的過程(實例=類名(參數1,參數2))
四、初始類和對象
類的定義:class Person: #class 類名:注意類名后面不要括號
類體
在python中,用變量表示特征,用函數表示技能,因而具有相同的特征和技能的一類事物就是‘類’,
對象則是這一類事物中具體的一個
類的兩種作用:屬性引用和實例化
1 class Person: 2 role = '中國人' #類屬性----靜態屬性 3 def walk(self): #這里的函數叫做方法-----動態屬性 4 #注意:self必須寫 5 print('person is walking ...') 6 print(Person.role) #查看類屬性 7 print(Person.walk) #查看類方法 , 用類名去調用方法名,打印出來的是內存地址
1 class Person: 2 role = '中國人' 3 def __init__(self,name,sex): 4 self.name=name 5 self.sex=sex 6 def walk(self): 7 print('person is walking') 8 9 hy = Person('haiyan',21) #實例化:類名(參數1,參數2) 類名()就等於在執行Person.__init__() 10 print(hy.name) #直接查看屬性 對象名.屬性名 11 print(hy) #返回的是一個對象 12 hy.walk() #調用方法 ,對象名.方法()
對象的兩種作用:查看屬性和調用方法(咋上面的實例化中講到)
五、關於self
self:在實例化時自動將對象/實例本身傳給__init__的第一個參數,你也可以給它起個別的名字,但是一般正常人都不會這么做,因為你改了別人就不認識了。
注意:def __init__(self): 這句話可以寫也可以不寫,只要有參數參進來的時候就必須得寫
def 方法名(self):這里的self必須得寫
六、特殊的類屬性
1 print(Person.__name__,type(Person.__name__)) #查看類的名字(這里的類名是字符串類型的) 2 print(Person.__dict__) #查出的是一個字典,key為屬性名,value為屬性值 3 print(Person.__doc__)# 就是把注釋顯示出來 4 print(dir(Person)) #查看類的方法,以列表的形式顯示出來 5 print(Person.__module__) #類定義所在的模塊 6 print(Person.__class__) 7 print(isinstance(hy,Person))#判斷對象 是否是類的實例
七、對象的相關知識
1.對象是關於類而實際存在的一個例子,即實例
2.對象/實例只有一種作用:屬性引用
egg = Person('egon',10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)
當然,你也可以引用一個方法,因為方法也是一個屬性。
八、面向對象小結
定義及調用的固定格式
1 class 類名: 2 def __init__(self,參數1,參數2): 3 self.對象的屬性1 = 參數1 4 self.對象的屬性2 = 參數2 5 6 def 方法名(self):pass 7 8 def 方法名2(self):pass 9 10 對象名 = 類名(1,2) #對象就是實例,代表一個具體的東西 11 #類名() : 類名+括號就是實例化一個類,相當於調用了__init__方法 12 #括號里傳參數,參數不需要傳self,其他與init中的形參一一對應 13 #結果返回一個對象 14 對象名.對象的屬性1 #查看對象的屬性,直接用 對象名.屬性名 即可 15 對象名.方法名() #調用類中的方法,直接用 對象名.方法名() 即可 16 17 小結
九、對象之間的交互
1 class Person: 2 def __init__(self,name,aggr,life_value): 3 self.name=name 4 self.aggr=aggr 5 self.life_value=life_value 6 def attack(self,dog): #人可以攻擊狗 7 dog.life_value=dog.life_value-self.aggr 8 class Dog: 9 def __init__(self,name,aggr,life_value): 10 self.name = name 11 self.aggr = aggr 12 self.life_value = life_value 13 14 def attack(self,egg): #狗也可以攻擊人 15 egg.life_value = egg.life_value - self.aggr 16 egg = Person('egon',250,1000) 17 dog = Dog('樂樂',50,2000) 18 print('狗沒攻擊前egon的生命值:',dog.life_value) #沒攻擊前egon的生命值 19 egg.attack(dog) #讓egon去攻擊狗樂樂 20 print('狗攻擊后egon的生命值:',dog.life_value) #攻擊后egon的生命值 21 22 23 print('egon沒攻擊前狗的生命值:',egg.life_value) #沒攻擊前egon的生命值 24 dog.attack(egg) #讓狗去攻擊egon 25 print('egon攻擊后狗的生命值:',egg.life_value) #攻擊后egon的生命值
十、類命名空間與對象,實例的命名空間
創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字成為類的屬性
而類有兩種屬性:靜態屬性和動態屬性
- 靜態屬性就是直接在類中定義的變量
- 動態屬性就是定義在類中的方法
