1.定義一個類(開闢一個內存空間)python
class Role(object): #定義一個類, class是定義類的語法,Role是類名,(object)是新式類的寫法 n = 123 #類變量,(存在類的內存) name = "類變量" def __init__(self, name, role, weapon, life_value=100, money=1000): #初始化方法(構造方法,構造函數) self.name = name #實例變量(靜態屬性),實例變量的做用域就是實例自己(存在實例的內存) self.role = role self.weapon = weapon self.__life_value = life_value #life前面的兩條下劃線加上以後稱做私有屬性 self.money = money def shot(self): #類的方法、功能(動態屬性) print("shooting...") def stat_life(self): print("name:%s,weapon:%s,lif_value:%s"%(self.name,self.weapon,self.__life_value)) def got_shot(self): print("ah..., got shot...",self.name) def buy_gun(self, gun_name): print("%s just bought %s" %(self.name,gun_name)) print("") def __del__(self): #析構函數,在實例釋放,銷燬(如將實例del或者程序退出)的時候自動執行,不須要去調用,一般用於一些收尾工做,關閉一些數據庫鏈接和打開的臨時文件 print("析構函數") def __my_test(self): print("私有方法") def my_test(self): self.__my_test()
● __init__()叫作初始化方法(或構造方法), 在類被調用時,這個方法(雖然它是函數形式,但在類中就不叫函數了,叫方法)會自動執行,進行一些初始化的動做,因此這裏寫的__init__(self,name,role,weapon,life_value=100,money=1000)就是要在建立一個角色時給它設置這些屬性。數據庫
● self就是實例自己(r1或者r2...)!實例化時python會自動把這個實例自己經過self參數傳進去。ide
2.實例化,把一個類變成具體對象的過程叫實例化函數
#print(Role) # 即便不實例化,這個Role類自己也已經存在內存裏 r1 = Role("fxl","police","AK47") #==>Role.__init__(r1,'fxl','police',’AK47’) r2 = Role("cx","thief","Knife") #==>Role.__init__(r2,'cx','thief',’Knife’)
●實例化具體過程spa
# 在內存中開闢一塊空間指向r1這個變量名對象
# 調用Role這個類並執行其中的__init__(…)方法,至關於Role.__init__(r1,'fxl','police',’AK47’),這樣是爲了把'fxl','police',’AK47’這3個值跟剛開闢的r1關聯起來,關聯起來後,你就能夠直接r1.name, r1.weapon 這樣來調用。因此這個__init__(…)方法裏的,self.name = name , self.role = role 會存到r1的內存空間裏。內存
# 實例化其實就是以類Role爲模版,在內存裏新開闢一塊空間,存上數據,賦值成一個變量名資源
3.調用實例中方法作用域
print(r1.name) r1.shot() r1.buy_gun("AK47") #python 會自動幫你轉成 Role.buy_gun(r1,"AK47")
4.類變量和實例變量的區別
it
print(Role.n) #不實例化也能夠調用類變量 Role.n = 456 #修改類變量 print(Role.n) print(r1.n,r1.name) #在實例中也能夠調用類變量,可是若是類變量中和實例變量中有相同變量名,會調用實例中的變量,如name,由於它會先在實例自己內存空間找,再去找類的內存空間找 print(r2.n,r2.name)
● 類變量做用:你們共用的屬性,節省開銷(若是全都使用實例變量,那麼每實例化一個對象都會新開闢一個內存空間,當實例不少的時候就會消耗內存資源,而類變量只會在類的內存空間存儲一次,每一個實例均可以調用)。
6.對實例r1操做
r1.name = "FXL" #修改實例r1的屬性,對於r2沒影響,由於實例化以後r1新開闢了一個內存空間 print(r1.name) r1.test1 = "test1" #給實例r1新增一個屬性 print(r1.name,r1.test1) del r1.test1 #刪掉實例的屬性 print(r1.test1)
7.私有方法和私有屬性(屬性<->變量):都是在方法或者屬性前面加兩條下劃線__,如上的__life_value屬性。變成私有屬性或方法以後在外部不可直接調用
#print(r1.__life_value) #對於__life_value屬性,直接調用報錯,顯示沒有這個屬性 #print(r1.__my_test()) #對於__my_test方法,直接調用報錯,顯示沒有這個屬性 print(r1.stat_life()) #可是能夠在類內部的方法中調用該屬性,而後再去調用該方法 print(r1.my_test()) #可是能夠在類內部的方法中調用該方法,而後再去調用該方法
總結:
● 上面的這個r1 = Role('Alex', 'police', 'AK47’)動做,叫作類的「實例化」, 就是把一個虛擬的抽象的類,經過這個動做,變成了一個具體的對象, 這個對象就叫作實例
● 剛纔定義的這個類體現了面向對象的第一個基本特性,封裝,其實就是使用構造方法將內容封裝到某個具體對象中,而後經過對象直接或者self間接獲取被封裝的內容
問題:在buy_gun(self, gun_name):等方法中爲何也要賦值給self這個參數?
●由於你在buy_gun(..)方法中可能要訪問r1的一些其它屬性, 好比這裏就訪問了r1的名字