類中程式碼執行順序 及 組合
阿新 • • 發佈:2018-11-21
一 類的名稱空間:
類中的程式碼在什麼時候執行的? 在例項化之前,也就是說在建立一個類時,類自己先給自己建立
建一塊空間,也就是公共的空間.(裡面會把靜態變數和__init__及方法方進去)
類中程式碼執行順序:(在例項化之前就執行了)
問題:一個類中可不可以沒有__init__? , 在沒有的情況下例項化經歷了哪些步驟
答案: 可以 , (1,建立一個空間給物件,將這個空間的地址返回)
class A: # Country = 'China' #靜態屬性 # def __init__(self,name): # self.name= name # def talk(self): # print('%s is talking'%self.name)
上程式碼中: A.Country='abc' # 修改靜態屬性 將其改為'abc'
del A.Country # 刪除靜態屬性 此時列印會報錯
print(A.__dict__) # 檢視靜態屬性
類的名稱空間中有什麼?
靜態屬性和動態屬性(方法)
2 物件的名稱空間和類的名稱空間之間的關係:
物件和類之間有一個單向的聯絡,類物件指標
物件在使用某個名字的時候,先在自己空間裡找,沒有就會去類空間去找.
class A: # Country = 'China' # def __init__(self,name): # self.name = name # def talk(self): # print('%s is talking'%self.name) # # alex = A('alex') # baoyuan = A('baoyuan') # print(alex.Country) # 'China' # 用的是靜態屬性自己裡沒有找的類的 # alex.Country = '泰國' # 自己建立了個Country屬性 名為泰國# print(alex.Country) # '泰國' 自己的 # del alex.Country # 刪除自己的屬性 # print(alex.Country) # 'China' # 又找的類的 # print(A.Country) # china # 靜態屬性類的 # print(baoyuan.Country) # china # 也是用的類的
因此 物件可以檢視類的靜態屬性,但不能修改(修改相當於給自己建立了一個,此時你要想再用類中的
靜態方法,除非刪除剛剛建立的),所以靜態屬性的修改,都應該用類名來完成.
因此得出 : 靜態屬性就是用來描述所有物件都共同的某一個值.
小例子:
# class People:
money = 1000 # def salary(self): # People.money += 1000 # 這裡只能用類名去修改他 ,如果用物件自己那相當於私房錢了
沒有彙總
# mother = People() # father = People() # mother.salary() # father.salary() # print(People.money,mother.money,father.money)
靜態屬性 再看一個例子:
class B: # l = [] # def __init__(self,name): # self.l.append(name) # self.l=[name] 下面所說的第三種情況 # # alex = B('alex') # baoyuan = B('寶元') # print(B.l) #['alex', '寶元'] # print(alex.l) # print(baoyuan.l
1 如果靜態變數是一個不可變資料型別,那麼只要物件修改這個資料,就相當於在物件的空間中新建
2 如果靜態變數是一個可變資料型別,那麼物件修改這個容器中的元素,相當於修改類的空間中的元素
3 如果靜態變數是一個可變資料型別,那麼物件直接對這個變數重新賦值,相當於修改物件自己空間中的元素
大結論
# 只要是靜態變數,就用類名去修改,永遠修改成功,並且所有的物件都共享這個改變
# 總結
# 物件的名稱空間:類指標\物件的所有屬性
# 類的名稱空間:方法和(靜態屬性\欄位)
# 物件在尋找名字的時候 : 先找物件自己記憶體空間中的,找不到就去類的名稱空間中尋找
# 類中的名字是什麼時候寫入記憶體的 : 程式碼從上到下執行的時候就已經寫入的.一定是在例項化之前
# 靜態變數 : 儘量用類名去操作
二 組合(一個類物件的屬性是另外一個類的物件)
先說下組合的特點:
組合指得是,在一個類中以另一個類的物件作為資料屬性,稱為組合
作用是可以將兩個本來不相關的類聯絡起來,一般兩個類之間有顯著的不同,很多時候還要附屬關係(有相同的屬性也有不同的屬性
).比如人和頭,手機和電池等
無縱向關係時用組合,有縱向關係用繼承
組合就是一個類中使用另一個類,從而把幾個類拼到一起,也為了減少程式碼
看兩個例子吧:
1(這是算一個圓環的面積和其周長)
from math import pi # 數學模組 用到 π class Yuan: def __init__(self,r): self.r=r def mianji1(self): return pi *self.r**2 def zhouchang(self): return 2*pi*self.r class Huan: def __init__(self,R,r): a=Yuan(R) b=Yuan(r) self.a=a self.b=b def mianji(self): return self.a.mianji1()-self.b.mianji1() # 相當於調了上個類的物件 讓他去執行 def zhouchang(self): return self.a.zhouchang()+self.b.zhouchang() zo=Huan(6,2) print(zo.mianji()) print(zo.zhouchang()) # 總體來說 把下面的引數傳給上一個物件,讓他去計算下面只要個結果,可以這麼理解(上面是專門
做複雜運算的,我把引數直接傳給上面讓其幫我運算) # 一個類物件的屬性是另類的物件
例子2
年月日的類
student類
class Birthday: # 生日類 def __init__(self,yaer,moth,day): # 生日資訊 self.yaer=yaer self.moth=moth self.day=day # a=Birthday() class Student: # 學生類 def __init__(self,name,sex,birthday): self.name=name self.sex=sex self.birthday=birthday birthday=Birthday(1991,2,2) b=Student('張三','不詳',birthday) print(b.birthday.yaer)