一、定義
組合:為乙個類的物件封裝屬性,這個屬性是另乙個類的例項
二、組合舉例
1、模擬遊戲類:
要求:(1):建立乙個任務角色類gamerole,構造方法中封裝三個屬性:name,ad(攻擊力),hp(血量)
(2):gamerole類中定義乙個方法attack:例項化兩個物件以及互相攻擊的功能
(3):建立乙個工具類weapon,構造方法中封裝三個屬性:name,ad(攻擊力)
(4):weapon類中定義乙個方法fight:例項化工具物件以及攻擊的力度
方案一 和方案2 對比:方案1使用的是非組合的形式,攻擊的發起者是工具,不符合人們的乙個習慣,攻擊的發起者應該是人,故方案二使用了類的組合的形式,其中物件gamerole1封裝了乙個屬性weapon1,weapon1是另乙個類weapon的乙個例項,很好的解決了攻擊的發起者是人的這個問題
class
gamerole
:def
__init__
(self,name,ad,hp)
: self.name = name
self.ad = ad
self.hp =hp
defattack
(self,obj)
: obj.hp = obj.hp -self.ad
print
("%s 攻擊%s ,%s 掉了 %s血,還剩%s血"
%(self.name,obj.name,obj.name,self.ad,obj.hp)
)def
equipment
(self,wea)
: self.wea = wea
class
weapon
:def
__init__
(self,name,ad)
: self.name = name
self.ad = ad
deffight
(self,obj1,obj2)
: obj2.hp = obj2.hp - self.ad
print
("%s用%s 攻擊%s ,%s 掉了 %s血,還剩%s血"
%(obj1.name, self.name,obj2.name, obj2.name, self.ad, obj2.hp)
)
gamerole1 = gamerole(
"role1",30
,200
)gamerole2 = gamerole(
"role2",20
,100
)weapon1 = weapon(
"刀",10)
weapon2 = weapon(
"劍",20)
weapon1.fight(gamerole1,gamerole2)
#方案1
gamerole1.equipment(weapon1)
gamerole1.wea.fight(gamerole1,gamerole2)
#方案2
2、模擬交通通知
要求:定義兩個類車輛類和通知類,車輛類和通知類並沒有共同點,但是要通知車主這兩個類就有了關聯,這時候可以把這兩個類組合在一起
class
car:
"""車輛類"""
def__init__
(self,car_type,car_number)
: self.car_type = car_type
self.car_number = car_number
deftype_info
(self)
:return self.car_type
defnumber_info
(self)
:return self.car_number
class
notice
:"""通知類"""
def__init__
(self,addr,message,car_info)
: self.addr = addr
self.message = message
self.car_info = car_info
defmessage_sms
(self)
:print
("車牌號為%s的%s在%s%s"
%(car1.car_number,car1.car_type,self.addr,self.message)
)
car1 = car(
"大貨車"
,"京y88988"
)notice1 = notice(
"天安門前"
,"違章停車"
,car1)
notice1.message_sms(
)#結果
#車牌號為京y88988的大貨車在天安門前違章停車
3、求圓環的面積和周長
要求:定義兩個類:圓類circle和圓環類ring,實現圓環的面積和周長的求解
from math import pi
class
circle
:""""圓類"""
def__init__
(self,r)
: self.r = r
defarea
(self)
:#圓的面積方法
return
(self.r**2)
*pi def
perimeter
(self)
:#圓的周長方法
return(2
*pi*self.r)
實現方式一:
class
ring
:"""圓環類"""
def__init__
(self,circle_out,circle_in)
: self.circle_out = circle_out
self.circle_in = circle_in
defarea
(self)
:#圓環的面積方法
return self.circle_out.area(
)-self.circle_in.area(
)def
perimeter
(self)
:#圓環的周長方法
return self.circle_out.perimeter(
)+self.circle_in.perimeter(
)
#求乙個圓環的面積和周長
c_out = circle(10)
#外圓的物件
c_in = circle(5)
#內圓的物件
ring=ring(c_out,c_in)
#圓環物件的屬性是**圓的兩個物件**
print
(ring.area())
#圓環面積
print
(ring.perimeter())
#圓環周長
#結果#235.61944901923448
#94.24777960769379
實現方式二:
class
ring
:def
__init__
(self,outside_r,inside_r)
: self.outside_c=circle(outside_r)
#類ring的物件的屬性 為 圓類的物件
self.inside_c=circle(inside_r)
defarea
(self)
:return self.outside_c.area(
)-self.inside_c.area(
)def
perimeter
(self)
:return self.outside_c.perimeter(
)+self.inside_c.perimeter(
)
ring=ring(20,
10)print
(ring.area())
print
(ring.perimeter())
#結果#235.61944901923448
#94.24777960769379
關於python類的組合
關於python類的組合,絞盡腦汁之後,寫了乙個生活中的簡單例子,有需要的童鞋可以理解下,水平有限,不對的地方望指正 coding utf 8 class engine 某發動機廠家描述發動機物件 definit self,enginenumber,horsepower self.enginenum...
Python高階 類的組合
定義乙個人的類,人有頭 軀幹 手 腳等資料屬性,這幾個屬性又可以是通過乙個類例項化的物件,這就是組合 1 class hand 2pass 3class foot 4pass 5class trunk 6pass 7class head 8pass910 class person 11def ini...
python3 類的組合使用
1.組合的定義 軟體重用的重要方式除了繼承之外還有另外一種方式,即 組合 組合指的是,在乙個類中以另外乙個類的物件作為資料屬性,稱為類的組合。class weapon def prick self,obj 這是該裝備的主動技能,扎死對方 obj 500 假設攻擊力是500 print obj cla...