Python类之间的依赖关系和组合关系
依赖关系指的是在一个类的方法中调用了另一个类的对象
组合关系则是指一个类的属性是其他类的对象(一对一和一对多) 依赖(关联)关系
类之间可以有三种关系: 依赖(关联)关系 组合(聚合)关系 继承(实现)关系
依赖(关联)关系指的是类对象执行某个动作的时候,需要其他类的对象来帮助完成这个操作的情况,其特点为: 将一个类的对象或者类名传到另一个类的方法中使用 此时的关系是最轻的,随时可以更换其他对象
关联关系的示例如下: class Person: def play(self, tools): tools.run() print("我要打游戏了") class Computer: def run(self): print("电脑已经打开,DNF已经登陆") class Phone: def run(self): print("王者荣耀已经登陆") xiaoming = Person() xmPhone = Phone() hwComp = Computer() xiaoming.play(xmPhone) xiaoming.play(hwComp)
输出的结果为: 王者荣耀已经登陆 我要打游戏了 电脑已经打开,DNF已经登陆 我要打游戏了
在这里补充两个删除对象的方法: delattr(对象名, "属性名") # 动态删除时比较常用 del 对象名.属性名
del 和 delattr 功能有限,只能删除实例属性,不能删除类属性: class GirlFriend: name = "小丽丽" eye_num = 2 sex = "女" def __init__(self, name, age): self.name = name self.age = age def chui_tui(self, num): print(f"{self.name}给大哥捶{num}次腿") self.love = True xiaoli = GirlFriend("小丽", 16) xiaohong = GirlFriend("小红", 17) del xiaoli.age delattr(xiaohong, "age") print(xiaoli.__dict__) print(xiaohong.__dict__)组合(聚合)关系
组合(聚合)关系是对象里包含对象的关系: 将一个类的对象封装到另一个类的对象的属性中,就叫组合一对一关系一对多关系
一对一关系示例: class BigB: def __init__(self, name, girl_friend=None): self.name = name self.girl_friend = girl_friend def eat(self): if self.girl_friend: print(f"{self.name}带着他的女朋友{self.girl_friend.name}去吃饭") else: print("单身狗,吃狗粮!") def movie(self): if self.girl_friend: print(f"{self.name}带着他的女朋友{self.girl_friend.name}去看电影") else: print("单身狗不陪看电影!") class Girl: def __init__(self, name): self.name = name bao = BigB("宝元") friend = Girl("唐艺昕") bao.eat() bao.movie() bao.girl_friend = friend bao.eat() bao.movie()
输出的结果为: 单身狗,吃狗粮! 单身狗不陪看电影! 宝元带着他的女朋友唐艺昕去吃饭 宝元带着他的女朋友唐艺昕去看电影一对多的组合关系
同一对一的组合关系类似,我们可以将多个类的对象封装为另一个类的属性,具体示例为: # 有一个男孩类和一个女孩类,男孩类中包含多个女孩类的对象 class Boy: def __init__(self, name): self.name = name self.girl_f = [] def ba_mei(self, girl): self.girl_f.append(girl) def happy(self): for i in self.girl_f: i.play() class Girl: def __init__(self, name): self.name = name def play(self): print(f"{self.name}陪你一起玩~o(=•ェ•=)m") xiaoqiang = Boy("小强") xiaohong = Girl("小红") xiaoli = Girl("小丽") xiaofei = Girl("小菲") xiaoqiang.ba_mei(xiaohong) xiaoqiang.ba_mei(xiaoli) xiaoqiang.ba_mei(xiaofei) xiaoqiang.happy()
输出的结果为: 小红陪你一起玩~o(=•ェ•=)m 小丽陪你一起玩~o(=•ェ•=)m 小菲陪你一起玩~o(=•ェ•=)m
组合关系与依赖关系的区别在于,组合关系是将类对象封装为新类的属性来使用,而依赖关系则是将类对象作为参数传给新类的方法使用。
一对多练习: 创建教师类和学生类 • 教师类有姓名和学生列表两个属性 • 教师类有添加学生的方法(添加的学生是具体对象) • 教师类有显示对应学生姓名和学号的方法 • 学生类有学号/姓名/教师姓名三个属性 • 创建多个学生,并添加到某位教师的学生列表中 • 打印该教师的学生
参考代码如下: class Teacher: def __init__(self, name): self.name = name self.student_list = [] def add_student(self, *student): # student前加了*,为了能一次性接收多个实例对象,方便后续使用 self.student_list.extend(student) for j in student: j.teacher = self.name def show_student(self): for i in self.student_list: print(f"姓名:{i.name},学号:{i.student_id}") class Student: def __init__(self, name, student_id): self.name = name self.student_id = student_id self.teacher = None alex = Teacher("Alex") bigB = Teacher("宝元") xiaoming = Student("小明", 123) xiaoqiang = Student("小强", 234) xiaohong = Student("小红", 345) xiaoli = Student("小丽", 456) xiaohu = Student("小虎", 135) alex.add_student(xiaoming ,xiaoli) bigB.add_student(xiaoqiang, xiaohong, xiaohu) alex.show_student() bigB.show_student() print(xiaoming.teacher) print(xiaoqiang.teacher)
需要注意,使用组合关系时,要尽量避免两个或多个类之间混合使用彼此的类对象作为自己的类属性,这样会陷入循环调用的麻烦中,容易引发混乱。
阿斯商务法庭正审理加维注册案件,球员仍存在免费离队的可能直播吧3月7日讯据阿斯报报道,巴塞罗那商务法庭正在审理加维续约注册的案件,若巴萨被认定不符合财政公平政策的条款,那么俱乐部将承担加维在6月30日原合同期满后自由离队的风险。去年9月
过往云烟邮报07惨败利物浦前,曼联球员群聊讨论争冠前景直播吧3月7日讯英超第26轮,曼联07惨败利物浦。每日邮报记者ChrisWheeler撰文谈到了战利物浦赛前曼联队内的情况。文章中表示,在联赛杯夺冠和足总杯战胜西汉姆联后,据说战利
研报笔记20230307(固态电池关键瓶颈突破)固态电池传统锂电的电解质是液态的,这导致了一系列的缺点,如耐用性差容量低,有安全隐患,以及有毒和碳足迹等环境问题,因此它并不太适合电动汽车等应用。为了解决这些缺点并进一步提高能量密
实操篇亚马逊关键词优化指南及工具分享!关键词优化并不是一个新内容,合理布局关键词可以增加产品被平台及搜索引擎收录的概率,提高权重,增加产品曝光量。但是对于亚马逊卖家来说,关键词又应该加在哪里?密度如何控制呢?一平台规则
数据结构与算法快速排序一定义同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。不同的是,冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基
用于工程应用的粘性土壤什么是黏性土?黏性土指含黏土粒较多,具有粒间连结的细粒土。具有黏性和可塑性,孔隙小而多,透水性弱,力学性质随含水量大小而变化等特点。土壤内聚力是土木工程和岩土工程的基本组成部分,为
3月6日加密新闻一览Binance。US是未注册的证券交易所吗?苹果为什么要封锁Uniswap?ConsenSys加入zkEVM大逃杀竞赛每日要闻3月6日,星期一加密货币市场正在挣扎!上周在非常狭窄的范围内横盘整理后,比特币和ETH在周五分别跌
全国多地上演抢车潮,部分车型卖断货,新能源车也出台新政促销费这两天,相信大家都被湖北上演的购车热潮吸住了眼球。不错,近日有关湖北东风汽车公司向省内消费者发放大额购车补贴,从而引发广大消费者抢购式订车,导致部分车型卖断货的消息一度冲上全网热搜
预防甲流最好的方法是?甲流(H1N1流感)是一种高度传染性的呼吸道疾病,以下是预防甲流的十条有效措施1。接种疫苗接种甲流疫苗是预防甲流最有效的方法之一。2。避免接触病毒避免接触已感染甲流的人或病毒污染的
童子尿煮蛋应不应该进非遗?吴昆成(华中师范大学)从幼儿园里收集童子尿煮蛋,还说能预防中暑,你有没有觉得有些荒谬?近日,浙江东阳一有关童子蛋的视频引发热议。据悉,童子蛋早在2008年就被列入了东阳市非遗名录。
王毅主任这趟没白跑,俄罗斯的长期盟友名单,为中国做了特殊安排俄方最近公布的一份长期盟友名单,为中国做了特殊安排,打得舆论猝不及防。王毅主任访问莫斯科这一趟,果然一点也没有白跑。俄乌打架,想拉中国下水的西方,千方百计企图将中国和俄罗斯绑到一块