

#面向對象 #類:模子。Person,不具體。 #實例/對象:依托于類產生的具體的帶有屬性的。alex #實例化:產生對象的過程。 alex = Person() #類: #分為靜態屬性(一般的變量)。動態屬性(函數) # 查看類中的靜態屬性:類.變量名 #查看類中的動態屬性:類.函數名(或方法名)--->得到的是函數的內存地址。 #調用動態屬性:類.函數名() #創建類:class 類名(第一個字母必須大寫,后面沒有括號): #創建對象: # alex = Person(參數): #內存中開辟一個屬于對象的內存空間 # 同時類中會自動執行 def __init__(self):函數 --->外面的參數會通過這里傳進來。 #self也會指向剛才對象打開的內存空間,self與alex內存地址相同。 #給__init__(self)傳參并定義self的變量值,存在內存地址中,執行結束后將結果返回給對象alex。 #這樣對象就產生了,可以用對象查看其中的各種屬性或者操作其它類中的方法。 #人狗大戰: # class Person: #建立一個類 # def __init__(self,name,sex,hp,ad): #初始化方法 # self.name = name # self.sex = sex # self.hp = hp # self.ad = ad #執行結束將各個變量值傳給對象。(因為在同一個內存地址) # def attack(self,dog): #類中的一個方法。可以用對象直接調用,必須用這個類實例化的對象來調用。 # print('%s攻擊了%s'%(self.name,dog.name)) # print('%s掉了%s點血,還剩%s點血'%(dog.name,self.ad,dog.hp-self.ad)) # # class Dog: # def __init__(self, name, kind, hp, ad): # self.name = name # self.kind = kind # self.hp = hp # self.ad = ad # def bite(self,person): # print('%s咬了%s'%(self.name,person.name)) # if person.hp <= self.hp: # person.hp = 0 # print('%s血量為0,game over'%person.name) # else: # print('%s掉了%s點血,還剩%s點血' % (person.name, person.ad, person.hp - self.ad)) # # alex = Person('alex','男',50,2) # egon = Person('egon','女',60,5) # taibai = Dog('taibai','taidy',60,90) # # taibai.bite(egon) # alex.attack(taibai) #用對象直接調用類中的方法,省掉再傳對象參數給self的麻煩。 #對象調用類中的屬性: #類中的屬性存在類開辟的內存空間中,其它各個對象會自動產生一個變量指針指向類的內存地址,調用的時候直接根據指針來查找即可。 # class Test: # country = 'china' # lis = ['span'] # # obj = Test() #創建了一個不帶參數的對象。 # print(obj.country) #此處便是對象通過指針在類中找到的屬性。 # obj.country = 'England' #表示在對象本身的內存空間中增加一個country屬性,并不改變類中的屬性。 # print(obj.country) # obj.lis = ['Japan'] # obj.lis[0] = 'England' #改變屬性時,對象會先在自己的內存空間找是否存在這個屬性,如果有,則改變,如果沒有則去類中找。 # print(obj.lis) #obj中剛剛創建了lis屬性,所以改變的是自己。 # obj.lis[0] = 'England' #如果沒有lis這個屬性,此處改的便是類中的屬性。 # print(obj.lis) # print(Test.lis) #總結:靜態屬性是所有對象共享的,所以如果要修改靜態屬性,最好用類直接修改最準確 #類名一般用來:查看或修改靜態屬性。 # 實例化對象 #對象名一般用來:查看或修改對象的屬性 # 調用方法
?
一、面向對象
?