Python 命名空間與對象的組合
一、類命名空間與對象、實例的命名空間
創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性
而類有兩種屬性:靜態屬性和動態屬性
靜態屬性就是直接在類中定義的變量
動態屬性就是定義在類中的方法
print(id(circle.name)) print(id(Circle.name))
結果:
1487618539568 1487618539568
print(circle.area) print(Circle.area)
結果:
創建一個對象/實例就會創建一個對象/實例的名稱空間,存放對象/實例的名字,稱為對象/實例的屬性
在obj.name會先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類...最后都找不到就拋出異常
二、面向對象的組合用法
軟件重用的重要方式除了繼承之外還有另外一種方式,即:組合
組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合
class?Weapon: ????def?prick(self,?obj):??#?這是該裝備的主動技能,扎死對方 ????????obj.life_value?-=?500??#?假設攻擊力是500 class?Person:??#?定義一個人類 ????role?=?'person'??#?人的角色屬性都是人 ????def?__init__(self,?name): ????????self.name?=?name??#?每一個角色都有自己的昵稱; ????????self.weapon?=?Weapon()??#?給角色綁定一個武器; ???????? egg?=?Person('egon') egg.weapon.prick()? #egg組合了一個武器的對象,可以直接egg.weapon來使用組合類中的所有方法
圓環是由兩個圓組成的,圓環的面積是外面圓的面積減去內部圓的面積。圓環的周長是內部圓的周長加上外部圓的周長。
這個時候,我們就首先實現一個圓形類,計算一個圓的周長和面積。然后在"環形類"中組合圓形的實例作為自己的屬性來用
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) '''? 運行結果:? 27? python?28000?4?months? '''
當類之間有顯著不同,并且較小的類是較大的類所需要的組件時,用組合比較好
軟件開發 人工智能 云計算 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。