python基礎-面向對象編程
面向對象編程
OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,並且可以大大提高程序開發效率 ,另外,基於面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。
面向對象的幾個核心特性如下
Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法
Object 對象
一個對象即是一個類的實例化後實例,一個類必須經過實例化後方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含著類的數據和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承
Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定
- 寫重復代碼是非常不好的低級行為
- 你寫的代碼需要經常變更
1 class Dog(object): 2 def __init__(self,name,dog_type): 3 """構造函數或者構造方法,也可以叫做初始化方法""" 4 self.Nmae = name #相當於d.Name = name 5 self.Dog_type = dog_type 6 7 def sayhi(self): #類的方法 8 print(‘You are a %s dog,your name is %s‘%(self.Dog_type,self.Nmae)) 9 def eat(self): #類的方法 10 pass 11 d = Dog(‘xiaowang‘,‘京巴‘) #相當於Dog(d,‘xiaowang‘,‘京巴‘),self:實例化後產生的對象叫做實例,這裏self指當前類的實例,也就是d。 12 """‘xiaowang,京巴 這兩個參數是給類的構造函數穿的參數‘""" 13 d.sayhi() #相當於d.sayhi(d) 14 15 輸出: 16 You are a 京巴 dog,your name is xiaowang
上面d = Dog(‘xiaowang‘,‘京巴‘),d就是類Dog實例化的一個實例,,print(Dog),print(d),輸出如下:
<class ‘__main__.Dog‘> # 即使不實例化,這個Dog類本身也是已經存在內存裏的 <__main__.Dog object at 0x0000000000DEA080> #d就是Dog實例化後的對象,也存在內存裏面
示例:
1 class Role(object): 2 def __init__(self,name,weapon,life_value = 100,money = 15000): 3 self.name = name 4 self.weapon = weapon 5 self.life_value = life_value 6 self.money = money 7 8 def shot(self): 9 print(‘%s is shooting‘%self.name) 10 def got_shot(self): 11 print("ah...,I got shot...") 12 def buy_gun(self,gun_name): 13 print(‘%s bought %s‘%(self.name,gun_name)) 14 self.weapon = gun_name #替換原有的武器 15 16 d1 = Role(‘cui‘,‘ak47‘) 17 d2 = Role(‘wang‘,‘B51‘) 18 d1.buy_gun(‘b21‘) 19 print(d1.weapon) 20 21 輸出: 22 cui bought b21 23 b21View Code
私有屬性跟公有屬性
私有屬性只能在類內部調用,定義的時候,self.__name = name,前面兩個下劃線。
class Role(object): def __init__(self,name,weapon,life_value = 100,money = 15000): self.name = name self.weapon = weapon self.life_value = life_value self.Money = money self.__high = 175 #定義一個私有屬性 def shot(self): print(‘%s is shooting‘%self.name) print(self.__high) #內部可以調用 def got_shot(self): print("ah...,I got shot...") def buy_gun(self,gun_name): print(‘%s bought %s‘%(self.name,gun_name)) self.weapon = gun_name #替換原有的武器 d1 = Role(‘cui‘,‘ak47‘) d2 = Role(‘wang‘,‘B51‘) d1.shot() print(d1.__high) #調用報錯 輸出: Traceback (most recent call last): cui is shooting File "D:/script/P_script/python_cq/temp.py", line 25, in <module> print(d1.__high) 175 AttributeError: ‘Role‘ object has no attribute ‘__high‘View Code
但是如果一定要從外部調用類的私有屬性,可以這樣
print(d1._Role__high)
如果要返回私有屬性的值怎麽辦呢?
class Role(object): def __init__(self,name,weapon,life_value = 100,money = 15000): self.name = name self.weapon = weapon self.life_value = life_value self.Money = money self.__high = 175 #定義一個私有屬性 def shot(self): print(‘%s is shooting‘%self.name) print(self.__high) #內部可以調用 def got_shot(self): print("ah...,I got shot...") def buy_gun(self,gun_name): print(‘%s bought %s‘%(self.name,gun_name)) self.weapon = gun_name #替換原有的武器 def high(self): #提供了一個外部訪問私有屬性的只讀接口 return self.__high d1 = Role(‘cui‘,‘ak47‘) d2 = Role(‘wang‘,‘B51‘) d1.shot() print(d1._Role__high) print(d1.high()) 輸出: cui is shooting 175 175 175View Code
公有屬性
python基礎-面向對象編程