类之间的依赖关系和组合关系

目录

  • 类之间的依赖关系和组合关系

    • 依赖(关联)关系
    • 组合(聚合)关系
    • 一对多的组合关系

类之间的依赖关系和组合关系

依赖(关联)关系

类之间可以有三种关系:

  1. 依赖(关联)关系
  2. 组合(聚合)关系
  3. 继承(实现)关系

依赖(关联)关系指的是类对象执行某个动作的时候,需要其他类的对象来帮助完成这个操作的情况,其特点为:

  • 将一个类的对象或者类名传到另一个类的方法中使用
  • 此时的关系是最轻的,随时可以更换其他对象

关联关系的示例如下:

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 对象名.属性名

deldelattr 功能有限,只能删除实例属性,不能删除类属性:

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)

需要注意,使用组合关系时,要尽量避免两个或多个类之间混合使用彼此的类对象作为自己的类属性,这样会陷入循环调用的麻烦中,容易引发混乱。

原文地址:https://www.cnblogs.com/shuoliuchina/p/12430882.html

时间: 2024-10-13 22:52:03

类之间的依赖关系和组合关系的相关文章

【未完成】类之间的各种关系

一.依赖关系 假设A类的变化引起了B类的变化,就说明B依赖于A. 在UML图中,用虚线箭头表示类之间的依赖关系. 依赖关系有下面具体三种情况. 1.A类是B类中的局部变量,这时,A的变化能够引起B变化,说明B依赖A. 2.A类是B类方法中的一个参数,A变化同样能引起B变化. 3.A类向B类发送消息,这样A也能使B发生变化,也能说B依赖A. public class Driver { public void drive(Car car){ //类Car是Driver里一个方法的参数,说明Car的变

Python设计模式 - 基础 - 类与类之间的六种关系

在程序中需要把世间万物抽象成相应的类,现实世界中物与物之间的关系和程序中类与类之间的关系相对应,因为世间万物是普遍联系的,所以程序中类与类之间也不是孤立的.在系统分析和框架设计中,根据面向对象机制的三大特性:封装.继承.多态,归纳和扩展出类与类之间六种不同的关系: - 依赖关系Dependency: 在局部变量,方法的形参,或者对静态方法的调用中实现 - 关联关系Association: 在类的成员变量中实现,可以双向也可以单向 - 聚合关系Aggregation: 强关联,整体与部分的关系,但

UML 类与类之间的四大关系的一些图标及代码含义

UML 类与类之间的四大关系的一些图标及代码含义 另一个版本: 关联:连接模型元素及链接实例,用一条实线来表示: 依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示: 聚合:表示整体与部分的关系,用一条实线加空心菱形来表示: 组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示: 泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示: 实现:表示类与接口的关系,用一条虚线加空心箭头来表示:类与类之间存在以下关系:(1)泛化(Generalization)(2)关

Prism 文档 第三章 管理组件之间的依赖关系

                                                                      第3章:管理组件之间的依赖关系 基于Prism库的复合应用程序可能包含许多松耦合的类型和服务.他们需要提供内容和接收基于用户行为的通知.因为他们是松散耦合的,他们需要一种方式进行互动和相互沟通来提供所需的业务功能. 为了集中这些不同的块,基于Prism库的应用程序依赖于依赖注入容器.依赖注入容器通过提供设施去实例化类的实例和管理他们基于容器配置的寿命来减少对

验证当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

结果:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行.

Hibernate中的Entity类之间的继承关系之一MappedSuperclass

在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate提供了4种兼容JPA的策略,解决Entity类的继承与关系数据库表的对应不匹配问题.这里介绍第一种MappedSuperclass. 在这种策略中,存在如下特征: 只在Entity类之间存在继承关系,其中的父Entity类使用@javax.persistence.MappedSuperclass标注

手动创建Maven项目并建立两个项目之间的依赖关系

用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId ->如果有默认值回车即可 最后 y 确认创建 我们看下他的目录结构 项目名: src ->main ->java ->test ->java pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0"

(转)类和类之间的依赖、关联、聚合、组合关系

原文 这一篇讲的挺到位的 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性.在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口. <ignore_js_op> 二.实现关系     实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系.在Ja

UML类图画法及类之间几种关系

文章目录如下: 一.类图画法 二.类之间的几种关系:泛化(Generalization).实现(Realization).关联(Association)(又分一般关联.聚合(Aggregation).组合(Composition)).依赖(Dependency) 一.类图画法 1.  类图的概念 A.显示出类.接口以及它们之间的静态结构和关系 B.用于描述系统的结构化设计 2.  类图的元素 类.接口.协作.关系,我们只简单介绍一下这四种元素. 同其他的图一样,类图也可以包含注解和限制. 类图中