類和物件的名稱空間
1.類中的程式碼是在什麼時候執行的?
在例項化之前
2一個類可不可以沒有__init__? 可以
1 class A: 2 Country = 'China' 3 def talk(self): 4 print('%s is talking'%self.name) 5 alex = A()
alex.name="alex"
alex.talk
3.在沒有__init__的情況下,例項化經歷了哪些步驟?
1,建立一個空間給物件
2,將這個空間的地址返回
4,靜態屬性的增刪改 :
1 class A: 2 Country = 'China' 3 def __init__(self,name): 4 self.name = name 5 def talk(self): 6 print('%s is talking'%self.name) 8 新增靜態屬性 9 A.靜態屬性名 = 'abc' 10 print(A.靜態屬性名) 11 修改靜態屬性 12 A.Country = '印度' 13 print(A.Country) 14 刪除靜態屬性 15 del A.Country16 print(A.Country) # 報錯 17 18 print(A.__dict__) # 只能看,不能改也不能刪
5.類的名稱空間有什麼:
靜態屬性
動態屬性(方法)
6.在例項化的過程中,又開闢了屬於物件的一塊空
7. 物件的名稱空間和類的名稱空間之間的關係 :
物件和類之間有一個單向的聯絡,類物件指標
物件在使用某個名字的時候,如果在自己的空間中沒有找到,就要到類的空間中去找
8.物件可以檢視類的靜態屬性,但是不能修改.並且一旦修改,就不能取到類當中的內容了(除非手動刪除這個修改的屬性)
9.所有的靜態屬性的修改,都應該由類名來完成,而不應該使用物件名來完成
10.靜態屬性就是用來描述所有的物件都共享的某一個值
練習1
1 """寫一個類,能夠記錄這個類有多少個物件了(每一次例項化都能夠被記錄下來)""" 2 第一種 3 class A: 4 count = 0 5 def __init__(self): 6 A.count += 1 7 print(A.count) 8 a = A() 9 print(A.count) 10 第二種 11 class A: 12 count = 0 13 def __init__(self): 14 self.counter() 15 def counter(self): 16 A.count+=1 17 a = A()
11.如果靜態變數是一個不可變資料型別,那麼只要物件修改這個資料,就相當於在物件的空間中新建
如果靜態變數是一個可變資料型別,那麼物件修改這個容器中的元素,相當於修改類的空間中的元素
如果靜態變數是一個可變資料型別,那麼物件直接對這個變數重新賦值,相當於修改物件自己空間中的元素
1 class B: 2 l = [] 3 def __init__(self,name): 4 self.l.append(name) 5 6 alex = B('alex') 7 baoyuan = B('寶元') 8 print(B.l) 9 print(alex.l) 10 print(baoyuan.l)
12.大結論:
只要是靜態變數,就用類名去修改,永遠修改成功,並且所有的物件都共享這個改變
13.總結:
物件的名稱空間:類指標\物件的所有屬性
類的名稱空間:方法和(靜態屬性\欄位)
物件在尋找名字的時候 : 先找物件自己記憶體空間中的,找不到就去類的名稱空間中尋找
類中的名字是什麼時候寫入記憶體的 : 程式碼從上到下執行的時候就已經寫入的.一定是在例項化之前
靜態變數 : 儘量用類名去操作
組合
1.什麼是組合:
一個類物件的屬性是另外一個類的物件
1 class Person: 2 def __init__(self,name,sex,hp,mp,ad): 3 self.name = name 4 self.sex = sex 5 self.hp = hp 6 self.mp = mp 7 self.ad = ad 8 def attack(self,dog): 9 print('%s攻擊了%s'%(self.name,dog.name)) 10 dog.hp -= self.ad 11 12 class Dog: 13 def __init__(self,name,kind,hp,ad): 14 self.name = name 15 self.kind = kind 16 self.hp = hp 17 self.ad = ad 18 def bite(self,person): 19 print('%s咬了%s'%(self.name,person.name)) 20 person.hp -= self.ad 21 22 alex = Person('alex','不詳',10,10,0.1) 23 hei = Dog('小黑','中華田園犬',999,1.1) 24 hei.bite(alex) 25 # 賺錢 26 # 充值 27 # 武器裝備 增加人的攻擊力ad 28 # 武器類 : 29 class Weapon: 30 def __init__(self,name,price,ad): 31 self.name = name 32 self.price = price 33 self.ad = ad 34 def skill(self,dog): 35 print('%s被%s攻擊了'%(dog.name,self.name)) 36 dog.hp -= self.ad 37 38 sh = Weapon('鞋底子',9.99,66) 39 # sh.skill(hei) 40 alex.武器 = sh # 組合 41 # 什麼是組合 : 一個類物件的屬性是另外一個類的物件 42 alex.武器.skill(hei) # 組合的應用 43 sh.ad -= 10 44 alex.武器.skill(hei)
練習1
1 """ 年月日的類 2 年 月 日 3 student類 4 姓名 性別 出生日期 5 """ 6 7 class Birthday: 8 def __init__(self,year,month,day): 9 self.year = year 10 self.month = month 11 self.day = day 12 13 class Student: 14 def __init__(self,name,sex,birth_day): 15 self.name = name 16 self.sex = sex 17 self.birthday = birth_day 18 19 birth = Birthday(1996,9,13) 20 bobo = Student('bobo','male',birth) 21 # bobo.birthday == birth 22 birth.year 23 print(bobo.birthday.year)
練習2
""" 環形類 例項化 接收引數 :大圓半徑 小圓半徑 有兩個對應的方法:計算環形周長,環形的面積 """ from math import pi class Circle: #定義了一個圓形類;提供計算面積(area)和周長(perimeter)的方法 def __init__(self,radius): self.radius = radius #屬性 半徑=半徑 def area(self): #圓的面積 return pi*self.radius*self.radius # 3.14*半徑*半徑 def perimeter(self): #圓的周長 return 2 * pi * self.radius # 2*3.14*半徑 circle =Circle(10) #例項化一個圓 areal = circle.area() #計算圓面積 per1=circle.perimeter()#計算圓周長 print(areal,per1) #列印圓面積和周長 class Ring: #定義了一個圓環形,提供圓環的面積和周長的方法 def __init__(self,radius_outside,radius_inside):#radius_outside 外圓的半徑 #radius_inside 內圓的半徑 self.outsid_circle=Circle(radius_outside) self.inside_circle=Circle(radius_inside) def area(self): return self.outsid_circle.area()-self.inside_circle.area() def perimeter(self): return self.outsid_circle.perimeter()+ self.inside_circle.perimeter() ring = Ring(10,5) #例項化一個環形 print(ring.perimeter()) #計算環形的周長 print(ring.area()) #計算環形的面積