python記錄_day17 類與類之間的關係
一、依賴關係
a類的物件是b類方法的引數
這種關係是我用著你,但你不屬於我,比如公司和臨時工的關係,是很弱的一種關係
1 class Zhiwu: 2 def __init__(self,name,atk): 3 self.name = name 4 self.atk = atk 5 def attack(self,zm): #物件作為引數傳遞 6 print("%s打了%s一下" % (self.name,zm.name)) 7 zm.hp -= zhiwu.atk依賴關係8 9 class Zombin: 10 def __init__(self,name,hp): 11 self.name = name 12 self.hp = hp 13 14 zhiwu = Zhiwu("豌豆射手",10) 15 zm =Zombin("鐵頭娃",1000) 16 zhiwu.attack(zm) 17 zhiwu.attack(zm) 18 zhiwu.attack(zm) 19 20 print("剩餘血量",zm.hp) 21 22 結果: 23 豌豆射手打了鐵頭娃一下 24 豌豆射手打了鐵頭娃一下 25 豌豆射手打了鐵頭娃一下26 剩餘血量 970
二、關聯關係、聚合關係、組合關係
a類的物件作為b類的一個屬性
這種關係是我用著你,你也屬於我
一對一的關係:
class Boy: def __init__(self,name,girlFriend= None): self.name = name self.girlFriend = girlFriend #關聯關係,物件是作為另一個類的屬性的 def chi(self): if self.girlFriend: print一對一關聯("%s和%s去吃飯" %(self.name,self.girlFriend.name)) self.girlFriend.happy() else: print("單身狗,自己一個人吃吧") class Girl: def __init__(self,name,age): self.name =name self.age = age def happy(self): print("出去吃東西很開心") g = Girl("小花",20) b = Boy("張三",g) # b.girlFriend = g b.chi() 結果: 張三和小花去吃飯 出去吃東西很開心
一對多的關係(反過來就是一對一)
比如,老師和學生,一個老師教多個學生,一個學生聽一個老師講
1 ''' 2 一對多,反過來是一對一, 3 一個老師對應多個學生,反過來一個學生對應一個老師 4 ''' 5 class Teacher: 6 7 def __init__(self,name,lst = None): #作為屬性,列表裝的是物件 8 self.name= name 9 if lst == None: 10 self.lst = [] 11 else: 12 self.lst = lst 13 # 新增學生 14 def add(self,s): 15 self.lst.append(s) 16 # 顯示學生 17 def display(self): 18 for el in self.lst: 19 print(el.name) 20 21 class Student: 22 23 def __init__(self,name,number): 24 self.name = name 25 self.number = number 26 27 s1 = Student("張三",1) 28 s2 = Student("李四",2) 29 s3 = Student("王五",3) 30 s4 = Student("麻子",4) 31 t = Teacher("濤哥") 32 t.add(s1) 33 t.add(s3) 34 t.add(s4) 35 t.display() 36 37 結果: 38 張三 39 王五 40 麻子一對多
聚合關係:屬於關聯關係中的一種特例。側重點是xxx和xxx聚合成xxx,各有各的生命週期。比如電腦,電腦裡有CPU、硬碟、記憶體等,電腦掛了,CPU還是好的,還是完整的個體。
組合關係:也屬於關聯關係中的一種特例。寫法上差不多, 組合關係比聚合還要緊密。比如 人的大腦、心臟、各個器官,這些器官組合成一個人。這時,人如果掛了,其他的東西也跟著掛了。
三、類的特殊方法
1、 類() 時自動執行__init__ , 進行初始化
2、 物件()時自動執行__call__ ,表示呼叫
3、 物件[key] 自動執行 __getitem__
4、物件[key] = value 自動執行 __setitem__
5、del 物件[key] 自動執行 __delitem__
6、 物件+物件 自動執行 __add__
7、with 物件 as 變數 自動執行 __enter__ 和 __exit__
8、 print(物件) 自動執行 __str__
9、 __hash__ == None 幹掉可雜湊,這樣物件就不可雜湊了
10、 __repr__ 用repr()時執行
11、__lt__ 用<時執行 __gt__ 用>時執行
12、 __le__ 用<=時執行 __ge__ 用<=時執行
13、 __eq__ 用==時執行
14、__format__ 用format()時呼叫
15、__new__ 建立物件時開闢記憶體,自動執行