1. 程式人生 > >類和物件的名稱空間

類和物件的名稱空間

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.Country
16 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()) #計算環形的面積