面向對象介紹(http://www.cnblogs.com/alex3714/articles/5188179.htm) 世界萬物,皆可分類 世界萬物,皆為對象 只要是對象,就肯定術語某種類 (1)特性 封裝、繼承、多態 Encapsulation 封裝 在類中對數據的賦值、內部調用對外部用戶是透明 ...
面向對象介紹(http://www.cnblogs.com/alex3714/articles/5188179.htm)
世界萬物,皆可分類
世界萬物,皆為對象
只要是對象,就肯定術語某種類
(1)特性 封裝、繼承、多態
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裡面包含著類的數據和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承
Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個介面,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老闆讓所有員工在九點鐘開始工作,
他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”,
因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裡引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定
class
object
(2)語法 屬性、方法、構造函數、析構函數
私有方法,私有屬性
創建類,並實例化兩個對象
class Role(object): '''創建一個角色的類''' def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name #實例變數(靜態屬性) self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): #方法(動態屬性) print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 r1.buy_gun("AK47")
把一個類變成一個具體對象的過程叫實例化。
__init__(self):構造函數,作用是在實例化時做一些類的初始化工作。
r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類與Role("alex","police","AK47")是一樣的,賦給一個變數的目的是防止被銷毀,python的記憶體回收機制,如果沒有變數,開闢的記憶體將會被回收。
調用r1 = Role("alex","police","AK47")等價於Role(r1,"alex","police","AK47")其中,self相當於r1,把r1當做參數傳進去了。
上面實例化過程中,self相當於r1,self.name等價於r1.name。每次實例化,都會把實例化的名字傳進去,r1 = Role("alex","police","AK47") 》Role(r1,"alex","police","AK47"), r2 = Role("jack","terroist","B15")》Role(r2,"jack","terroist","B15")
r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15") #生成一個角色
r1.buy_gun("AK47")
r2.get_shot() #調用r2相當於Role.get_shot(r2)
上面調用的過程中,r2.get_shot()相當於Role.get_shot(r2)。實例變數的作用域就是實例本身。
類中的函數叫方法;
類變數和實例變數的方法:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) # r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 # r2 = Role("jack","terroist","B15") #生成一個角色 print(Role.n)
上面代碼中,我們給類添加了一個變數n,可以發現,我們沒有創建實例,就可以調用,說明n是存在類變數中的。
下麵創建實例,看是否可以調用:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 print(Role.n) print("r1.n:",r1.n)
上面,實例裡面不包含n,但是也可以了,說明實例沒有這個變數會去類裡面找。
現在我們創建了一個name的類變數,由於實例裡面也包含name屬性。看是調用那個方法。
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 print(Role.n) print("r1.n:",r1.n) print("r1.name:",r1.name)
運行結果如下
123
r1.n: 123
r1.name: alex
從上面代碼可以看出,先去實例裡面找變數,如果沒有才會去類中進行查找。
下麵給類修改變數。
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r1.name = "chenronghua" #給實例修改名字 r2 = Role("jack","terroist","B15") #生成一個角色 r2.name = "小豬豬" #給實例重新進行賦值 print(Role.n) print("r1.n:",r1.n) print("r1.name:",r1.name)
運行結果如下:
123
r1.n: 123
r1.name: chenronghua
從上面可以看出,實例化之後,我們可以給實例化的變數重新賦值,修改裡面的值。
下麵我們給實例本身添加一個新的屬性:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r1.name = "chenronghua" r1.bullet_vests = True #屬性不存在,重新創建一個屬性 r2 = Role("jack","terroist","B15") #生成一個角色 r2.name = "小豬豬" print("bullet_vests",r1.bullet_vests) print("r2.bullet_vests:",r2.bullet_vests)
運行結果如下:
bullet_vests True
Traceback (most recent call last):
File "/home/zhuzhu/第六天/CF.py", line 29, in <module>
print("r2.bullet_vests:",r2.bullet_vests)
AttributeError: 'Role' object has no attribute 'bullet_vests
上面,我們給r1實例創建了一個bullet_vests的新屬性,可以看出,能夠給實例r1創建新的屬性,創建的屬性r2實例是不具備的。
下麵來刪除實例裡面的變數:刪除r1實例中的weapon
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r1.name = "chenronghua" del r1.weapon #刪除實例r1中的weapon r2 = Role("jack","terroist","B15") #生成一個角色 r2.name = "小豬豬" print(r2.weapon) print(r1.weapon)
運行結果如下:
B15
Traceback (most recent call last):
File "/home/zhuzhu/第六天/CF.py", line 29, in <module>
print(r1.weapon)
AttributeError: 'Role' object has no attribute 'weapon
從運行結果可以看出,刪除實例r1中的weapon之後,實例r2中的weapon不受影響,但是實例r1中的weapon不存在了。
如果我們刪除Role類中的weapon,那麼肯定r1.weapon和r2.weapon都不能調用。
下麵來看一下,實例裡面是否可以修改類變數:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r1.name = "chenronghua" r1.n = "666可以改嗎" #修改類中的變數,看是否可以成功 r2 = Role("jack","terroist","B15") #生成一個角色 r2.name = "小豬豬" print("r1.n:",r1.n) print("r2.n:",r2.n)
運行結果如下:
r1.n: 666可以改嗎
r2.n: 123
從上面代碼可以看出,r1.n="666可以改嗎"等於在實例r1中重新創建了一個變數n,因為實例r1中不存在n,不影響類本身Role.n中的值。
類記憶體和類生成的實例記憶體。
類變數的用途?大家共用的屬性,節省開銷。比如防彈衣,預設是沒有穿防彈衣的,我們可以在類中定義一個bullet_vests="",這樣,每個人都具有了防彈衣的屬性。當某人買了放單衣的時候,直接r1.bullet_vests=True即可。雖然可以在屬性裡面定義,但是這樣每個屬性裡面都創建了bullet_vests,浪費了記憶體。在類中只需創建一次即可。
析構函數
析構函數:在實例釋放、銷毀的時候執行的,通常用於做一些收尾工作,如關閉一些資料庫鏈接,打開的臨時文件,可以在裡面進行操作。
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def __del__(self): #不需要傳參數,實例結束之後自動執行,不用調用直接執行 析構函數 print("%s 徹底死了" %self.name) def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r1.name = "chenronghua" r1.n = "666可以改嗎" r2 = Role("jack","terroist","B15") #生成一個角色 r2.name = "不努力" r1.get_shot() r2.shot()
運行結果如下:
ah....,I got shot......
shotting.......
chenronghua 徹底死了
不努力 徹底死了
從上面代碼可以看出,__del__析構函數在程式退出的時候自動執行。就是在我們運行玩類之後,自動銷毀變數。是在所有調用結束不使用的時候才銷毀的。
__del__析構函數不需要自己調用,在程式調用結束後自動執行。
私有方法,私有屬性
私有方法,私有屬性:就是只能內部訪問,外部訪問不了。
比如上面類中的self.life_value屬性,我們知道,任何人執行程式都可以調用r1.life_value=0,直接讓生命值變為0,如下:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def __del__(self): #不需要傳參數,實例結束之後自動執行,不用調用直接執行 print("%s 徹底死了" %self.name) def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 print("modify before:",r1.life_value) r1.life_value = 0 print("modify after:",r1.life_value)
運行結果如下:
modify before: 100
modify after: 0
alex 徹底死了
jack 徹底死了
從上面代碼可以看出,開始的時候r1.life_value生命值是100滿的,但是我們修改了生命值,直接讓生命值變成0;可以看出,生命值直接改變了。假如是一款游戲的話,上來直接別人修改生命值就掛了,還沒有摸過女生的屁股就死了,這他媽也太冤枉了吧。所以,這樣肯定是不行的,不能讓外部調用機密的屬性,只能在內部進行調用。如下:
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.__life_value = life_value self.money = money # def __del__(self): #不需要傳參數,實例結束之後自動執行,不用調用直接執行 # print("%s 徹底死了" %self.name) def show_status(self): print("name:%s weapon:%s life_value:%s" %(self.name,self.weapon,self.__life_value)) def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 print(r1.__life_value)
運行結果如下:
Traceback (most recent call last):
File "/home/zhuzhu/第六天/CF.py", line 30, in <module>
print(r1.__life_value)
AttributeError: 'Role' object has no attribute '__life_value'
從上面運行結果可以看出,當我們把變數life_value設置為私有變數__life_value的時候,外部是不能夠調用的。錯誤提示是:Role類中沒有__life_value屬性。
既然私有屬性不能在外部調用,那麼我們就在程式內部調用。
class Role(object): '''創建一個角色的類''' n = 123 #類的變數,存在類的記憶體中 name = "我是類name" def __init__(self,name,role,weapon,life_value=100,money=15000): '''初始化變數''' self.name = name self.role = role self.weapon = weapon self.__life_value = life_value self.money = money # def __del__(self): #不需要傳參數,實例結束之後自動執行,不用調用直接執行 # print("%s 徹底死了" %self.name) def show_status(self): '''通過內部調用私有屬性''' self.__life_value -= 50 print("name:%s weapon:%s life_value:%s" %(self.name,self.weapon,self.__life_value)) def shot(self): print("shotting.......") def get_shot(self): print("ah....,I got shot......") def buy_gun(self,gun_name): print("%s just bougnt %s" %(self.name,gun_name)) r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類 r2 = Role("jack","terroist","B15") #生成一個角色 r1.show_status() #通過函數內部調用私有屬性
運行結果如下:
name:alex weapon:AK47 life_value:50
上面代碼,我們在類內部新增了一個方法,用來調用私有屬性,可以看出,在內部是可以調用私有屬性的。並且能夠正常調用執行私有屬性。
因此,私有屬性是能夠調用的,只是需要在程式內部執行。在外部是不能調用的。這種情況適用於很多時候,比如我們不希望別人查看我們的密碼,銀行賬號,一些私有的屬性,都可以通過設置這種私有屬性的方法來規避。
也可以設置私有方法,只需要在前面添加__get_shot(self)就設置了一個私有方法,私有方法在外部是不能夠調用的。