1. 程式人生 > >類中程式碼執行順序 及 組合

類中程式碼執行順序 及 組合

一  類的名稱空間:

  類中的程式碼在什麼時候執行的?  在例項化之前,也就是說在建立一個類時,類自己先給自己建立

建一塊空間,也就是公共的空間.(裡面會把靜態變數和__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)