python 依賴關係 與關聯關係
阿新 • • 發佈:2018-11-08
#簡單版本(依賴關係) # class Daxiang(): # def open(self,door): # print('我是大象,我想開門') # door.open() # print('謝謝,你幫我開門!!!') # # def zhuang(self): # print('門已經開了,那我就進去了') # def close(self,door): # print('我已經進去了,幫我關門') # door.close() # print('謝謝幫我關門,我呀死了')# # class Door: # def open(self): # print('我是門,是叫我開門嗎?那我開了') # # def close(self): # print('我是門,你確定關門嗎?馬上就關') # # D = Door() # gg = Daxiang() # gg.open(D) # gg.zhuang() # gg.close(D) # # 以某個物件為主體,主體要使用副體的某個功能,任何的物件只要擁有這個功能的,都能成為這個副體 》》》 那麼主體與副體的關係就是 依賴關係
加強版(依賴關係)
classZombie: def __init__(self,name,attrack,hp): self.name = name self.attrack = attrack self.hp = hp def Attrack_To_Plant(self,P): P.hp -= self.attrack if P.hp <= 0: print('真慘,你一陣亡') else: print('注意,你還剩餘的血量是%s' % P.hp) zicai= Plant('紫菜',10,100) #建立一個植物的物件 zombie1 = Zombie('殭屍1',5,100)#建立一個殭屍的物件 zicai.Attrack(zombie1) #紫菜攻擊殭屍1 一次 zicai.Attrack(zombie1) #紫菜攻擊殭屍1 一次 zicai.Attrack(zombie1) #紫菜攻擊殭屍1 一次 zicai.Attrack(zombie1) #紫菜攻擊殭屍1 一次 zombie1.Attrack_To_Plant(zicai)#殭屍攻擊紫菜
關聯關係
class Person: def __init__(self,name,Bag=None): self.name = name self.bag = Bag def GTA(self): if self.bag: print('%s 你在幹啥,還不帶上你的%s去幹啥'%(self.name,self.bag.name)) else: print('連個包都沒有,還能去哪') class BB: def __init__(self,name): self.name = name gg = Person('小明') New_bag = BB('書包') gg.bag = New_bag gg.bag = 0 gg.GTA() # 關聯關係:主體的某個屬性 是一個物件(副體) ,這個物件在賦值給主體的屬性之後,相當屬於主體的一部分,如果主體要使用副體的功能 可以直接通過屬性找到該物件之後,進行功能的呼叫就可以了
加強版(關聯關係)
class Teacher: def __init__(self,name,lst=None): self.name = name if lst == None: self.lst = [] else: self.lst = lst def Append(self,s): self.lst.append(s) class Student: def __init__(self,No,name,age): self.name = name self.No = No self.age = age T1 = Teacher('小瀋陽') print(T1.name) print(T1.lst) S1 = Student(1,'Luffy',18) S2 = Student(2,'Luffy2',18) S3 = Student(3,'Luffy3',18) S4 = Student(4,'Luffy4',18) T1.Append(S1) T1.Append(S2) for i in T1.lst: print(i.name)View Code
繼承關係:self在訪問方法時候,現在自己的名稱空間查詢,如果在自己的名稱空間找不到的話,再到父類的名稱空間
去查詢,如果在父類都還找不到的話,就出相應的報錯。
同時注意的是哪個物件一開始進行呼叫方法的,self就是那個物件,即使物件本身沒有該方法,通過繼承關係到父類查詢
名稱相同的方法進行呼叫的時候,self也沒有沒有變的
class Base: def __init__(self, num): self.num = num def func1(self): print(self.num) self.func2() def func2(self): print(111, self.num) class Foo(Base): def func2(self): print(222, self.num) lst = [Base(1), Base(2), Foo(3)] for obj in lst: obj.func2() 結果: 111 1 111 2 222 3View Code