依赖关系指的是在一个类的方法中调用了另一个类的对象 组合关系则是指一个类的属性是其他类的对象(一对一和一对多)依赖(关联)关系 类之间可以有三种关系:依赖(关联)关系组合(聚合)关系继承(实现)关系 依赖(关联)关系指的是类对象执行某个动作的时候,需要其他类的对象来帮助完成这个操作的情况,其特点为:将一个类的对象或者类名传到另一个类的方法中使用此时的关系是最轻的,随时可以更换其他对象 关联关系的示例如下:classPerson:defplay(self,tools):tools。run()print(我要打游戏了)classComputer:defrun(self):print(电脑已经打开,DNF已经登陆)classPhone:defrun(self):print(王者荣耀已经登陆)xiaomingPerson()xmPhonePhone()hwCompComputer()xiaoming。play(xmPhone)xiaoming。play(hwComp) 输出的结果为:王者荣耀已经登陆我要打游戏了电脑已经打开,DNF已经登陆我要打游戏了 在这里补充两个删除对象的方法:delattr(对象名,属性名)动态删除时比较常用del对象名。属性名 del和delattr功能有限,只能删除实例属性,不能删除类属性:classGirlFriend:name小丽丽eyenum2sex女definit(self,name,age):self。namenameself。ageagedefchuitui(self,num):print(f{self。name}给大哥捶{num}次腿)self。loveTruexiaoliGirlFriend(小丽,16)xiaohongGirlFriend(小红,17)delxiaoli。agedelattr(xiaohong,age)print(xiaoli。dict)print(xiaohong。dict)组合(聚合)关系 组合(聚合)关系是对象里包含对象的关系:将一个类的对象封装到另一个类的对象的属性中,就叫组合一对一关系一对多关系 一对一关系示例:classBigB:definit(self,name,girlfriendNone):self。namenameself。girlfriendgirlfrienddefeat(self):ifself。girlfriend:print(f{self。name}带着他的女朋友{self。girlfriend。name}去吃饭)else:print(单身狗,吃狗粮!)defmovie(self):ifself。girlfriend:print(f{self。name}带着他的女朋友{self。girlfriend。name}去看电影)else:print(单身狗不陪看电影!)classGirl:definit(self,name):self。namenamebaoBigB(宝元)friendGirl(唐艺昕)bao。eat()bao。movie()bao。girlfriendfriendbao。eat()bao。movie() 输出的结果为:单身狗,吃狗粮!单身狗不陪看电影!宝元带着他的女朋友唐艺昕去吃饭宝元带着他的女朋友唐艺昕去看电影一对多的组合关系 同一对一的组合关系类似,我们可以将多个类的对象封装为另一个类的属性,具体示例为:有一个男孩类和一个女孩类,男孩类中包含多个女孩类的对象classBoy:definit(self,name):self。namenameself。girlf〔〕defbamei(self,girl):self。girlf。append(girl)defhappy(self):foriinself。girlf:i。play()classGirl:definit(self,name):self。namenamedefplay(self):print(f{self。name}陪你一起玩o()m)xiaoqiangBoy(小强)xiaohongGirl(小红)xiaoliGirl(小丽)xiaofeiGirl(小菲)xiaoqiang。bamei(xiaohong)xiaoqiang。bamei(xiaoli)xiaoqiang。bamei(xiaofei)xiaoqiang。happy() 输出的结果为:小红陪你一起玩o()m小丽陪你一起玩o()m小菲陪你一起玩o()m 组合关系与依赖关系的区别在于,组合关系是将类对象封装为新类的属性来使用,而依赖关系则是将类对象作为参数传给新类的方法使用。 一对多练习:创建教师类和学生类教师类有姓名和学生列表两个属性教师类有添加学生的方法(添加的学生是具体对象)教师类有显示对应学生姓名和学号的方法学生类有学号姓名教师姓名三个属性创建多个学生,并添加到某位教师的学生列表中打印该教师的学生 参考代码如下:classTeacher:definit(self,name):self。namenameself。studentlist〔〕defaddstudent(self,student):student前加了,为了能一次性接收多个实例对象,方便后续使用self。studentlist。extend(student)forjinstudent:j。teacherself。namedefshowstudent(self):foriinself。studentlist:print(f姓名:{i。name},学号:{i。studentid})classStudent:definit(self,name,studentid):self。namenameself。studentidstudentidself。teacherNonealexTeacher(Alex)bigBTeacher(宝元)xiaomingStudent(小明,123)xiaoqiangStudent(小强,234)xiaohongStudent(小红,345)xiaoliStudent(小丽,456)xiaohuStudent(小虎,135)alex。addstudent(xiaoming,xiaoli)bigB。addstudent(xiaoqiang,xiaohong,xiaohu)alex。showstudent()bigB。showstudent()print(xiaoming。teacher)print(xiaoqiang。teacher) 需要注意,使用组合关系时,要尽量避免两个或多个类之间混合使用彼此的类对象作为自己的类属性,这样会陷入循环调用的麻烦中,容易引发混乱。