python 依赖关系 与关联关系
#简单版本(依赖关系) # 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) # # 以某个对象为主体,主体要使用副体的某个功能,任何的对象只要拥有这个功能的,都能成为这个副体 》》》 那么主体与副体的关系就是 依赖关系
加强版(依赖关系)
class Zombie: 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)
继承关系: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 3