python3 類的組合使用


1.組合的定義

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

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

class Weapon: def prick(self,obj):  # 這是該裝備的主動技能,扎死對方
        obj -= 500  # 假設攻擊力是500
        print(obj) class Person:  # 定義一個人類
    role = 'person'  # 人的角色屬性都是人

    def __init__(self, name): self.name = name  # 每一個角色都有自己的昵稱;
        self.weapon = Weapon()  # 給角色綁定一個武器;
 egg = Person('egon') obj = 1000 egg.weapon.prick(obj)

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

3.組合的應用例子-實例化組合調用

  用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如教授有生日,教授教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 '''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM