1. 程式人生 > >面向對象 名稱空間和組合

面向對象 名稱空間和組合

類之間的關系 dbo 實現 area home python ice end style

類名稱空間與對象的名稱空間

創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性

而類有兩種屬性:靜態屬性和動態屬性

  • 靜態屬性就是直接在類中定義的變量
  • 動態屬性就是定義在類中的方法

創建一個對象/實例就會創建一個對象/實例的名稱空間,存放對象/實例的名字,稱為對象/實例的屬性

在obj.name會先從obj自己的名稱空間裏找name,找不到則去類中找,類也找不到就找父類...最後都找不到就拋出異常

無論創建多少個對象,都是獨立的,哥哥對象互不幹擾.

# job1 = ‘teacher‘
# class A:
#     home = ‘老男孩教育‘
#
name = ‘武大‘ # def __init__(self, name, age): # self.name = name # self.age = age # def job(self): # print(‘我在開車.....‘) # 查詢順序 # 對象的查詢順序:先從對象空間去找,對象的空間沒有此變量或者方法,通過對象中的類對象指針去類中尋找. # obj1 = A(‘oldboy‘,1000) # obj1 = A(‘oldboy‘,1000) # obj1 = A(‘oldboy‘,1000) # obj1 = A(‘oldboy‘,1000)
# print(obj1.name) # print(obj1.job) # print(obj1.home) # 類的查詢順序: 直接從類本身找. # print(A.name) # 對象的問題 # 無論創建多少對象,都是開辟獨立的空間,各個對象之間不能互相查找,幹擾. # obj1 = A(‘oldboy‘,1000) # obj2 = A(‘alex‘,10000)

計算一個類實例化多少個對象:

# class A:
#     home = ‘老男孩教育‘
#     name = ‘武大‘
#     count = 0
#     def __init__(self, name, age):
# A.count = A.count + 1 # self.name = name # self.age = age # def job(self): # print(‘我在開車.....‘) # # obj1 = A(‘alex1‘,1000) # obj2 = A(‘alex2‘,1000) # obj3 = A(‘alex3‘,1000) # obj4 = A(‘alex4‘,1000) # print(A.count)

組合------------

面向對象的組合用法

軟件重用的重要方式除了繼承之外還有另外一種方式,即:組合

組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合

技術分享圖片

圓環是由兩個圓組成的,圓環的面積是外面圓的面積減去內部圓的面積。圓環的周長是內部圓的周長加上外部圓的周長。
這個時候,我們就首先實現一個圓形類,計算一個圓的周長和面積。然後在"環形類"中組合圓形的實例作為自己的屬性來用

from math import pi

class Circle:
    ‘‘‘
    定義了一個圓形類;
    提供計算面積(area)和周長(perimeter)的方法
    ‘‘‘
    def __init__(self,radius):
        self.radius = radius

    def area(self):
         return pi * self.radius * self.radius

    def perimeter(self):
        return 2 * pi *self.radius


circle =  Circle(10) #實例化一個圓
area1 = circle.area() #計算圓面積
per1 = circle.perimeter() #計算圓周長
print(area1,per1) #打印圓面積和周長

class Ring:
    ‘‘‘
    定義了一個圓環類
    提供圓環的面積和周長的方法
    ‘‘‘
    def __init__(self,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()) #計算環形的面積

用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如教授有生日,教授教python課程

class BirthDate:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

class Couse:
    def __init__(self,name,price,period):
        self.name=name
        self.price=price
        self.period=period

class Teacher:
    def __init__(self,name,gender,birth,course):
        self.name=name 
        self.gender=gender
        self.birth=birth
        self.course=course
    def teach(self): 
        print(teaching)
p1=Teacher(egon,male, 
            BirthDate(1995,1,27), 
            Couse(python,28000,4 months)
           ) 

print(p1.birth.year,p1.birth.month,p1.birth.day) 

print(p1.course.name,p1.course.price,p1.course.period)
‘‘‘ 
運行結果: 
1 27 
python 28000 4 months 
‘‘‘

當類之間有顯著不同,並且較小的類是較大的類所需要的組件時,用組合比較好

面向對象 名稱空間和組合