python学习笔记:第17天 面向对象03 类与类之间的关系
一、类与类之间的依赖关系
⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类
中存在以下关系:
- 依赖关系
- 关联关系
- 组合关系
- 聚合关系
- 继承关系
- 实现关系
依赖关系
可以简单的理解,就是一个类a使用到了另一个类b,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是b类的变化会影响到a。表现在代码层面,类a当中使用了类b,其中类b是作为类a的方法参数、方法中的局部变量、或者静态方法调用。注意,要避免双向依赖。一般来说,不应该存在双向依赖。
class person: def eat(self, food): print(f'我要吃{food.name}') def read(self, book): print(f'我在看{book.book_name}') class food: def __init__(self, name): self.name = name class book: def __init__(self, book_name): self.book_name = book_name apple = food('苹果') book = book('红楼梦') p = person() p.eat(apple) # apple对象以方法参数的形式传入到p对象中使用 p.read(book) # 可以说是person类是依赖于food类和book类 # 执行结果: # 我要吃苹果 # 我在看红楼梦
关联关系.组合关系, 聚合关系
其实这三个在代码上写法是⼀样的. 但是, 从含义上是不⼀样的.
关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.
聚合关系. 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期. 比如电脑. 电脑⾥有cpu, 硬盘, 内存等等. 电脑挂了. cpu还是好的. 还是完整的个体
组合关系. 属于关联关系中的⼀种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如⼈的⼤脑, ⼼脏, 各个器官. 这些器官组合成⼀个⼈. 这时. ⼈如果挂了. 其他的东⻄也跟着挂了.
我们来看一个例子:
class boy: def __init__(self, name, grilfriend): self.name = name self.grilfriend = grilfriend # grilfriend参数以变量的形式存储在boy类中,这就形成了关联关系 def sendgift(self): print(f'送给女朋友{self.grilfriend.name}一个礼物') class girl: def __init__(self, name): self.name = name girl = girl('小麻烦') boy = boy('马脸', girl) # 此时在boy对象初始化时把girl对象当作传参数出入类中 boy.sendgift() # 运行结果: # 送给女朋友小麻烦一个礼物
上面例子就是一个关联关系,一般男女朋友都是固定的,不可能经常更换;girl对象作为boy的变量存在与boy类中,如果缺失这个属性,boy类可能无法正常工作。其实这样的关系在生活中还有很多,比如说学生和老师:
# 老师和学生的关系,一对多的关系 反过来就是一对一 class tearcher: def __init__(self, name, stulist=none): self.name = name if stulist: self.stulist = stulist else: self.stulist = [] def addstudent(self, student): self.stulist.append(student) def showstudent(self): for stu in self.stulist: print(stu.id, stu.name, stu.teacher) class student: def __init__(self, sid, name, teacher=none): self.id = sid self.name = name if teacher: self.teacher = teacher.name else: self.teacher = none t = tearcher('大张伟') s1 = student(1, '郭德纲') s2 = student(2, '小沈阳', t) s3 = student(3, '宋小宝') s4 = student(4, '岳云鹏', t) t.addstudent(s1) t.addstudent(s2) t.addstudent(s3) t.addstudent(s4) t.showstudent() # 运行结果: # 1 郭德纲 none # 2 小沈阳 大张伟 # 3 宋小宝 none # 4 岳云鹏 大张伟
一个老师可以有多个学生,这就是一对多的关系了;如果反过来,一个学生只有一个老师,那就是一对一的关系,好了. 这就是关联关系。当我们在逻辑上出现了:我需要你,你还得属于我,这种逻辑就是关联关系,那注意这种关系的紧密程度比上⾯的依赖关系要紧密的多
- 组合关系和聚合关系. 其实代码上的差别不⼤. 都是把另⼀个类的对象作为这个类的属性来传递和保存. 只是在含义上会有些许的不同⽽已
- 继承关系和实现关系的内容后期再学习到继承的时候再补上
二、类中的特殊成员
什么是特殊成员呢?__init_()
就是⼀个特殊的成员. 说⽩了. 带双下划线的那⼀坨. 这些⽅
法在特殊的场景的时候会被⾃动的执⾏。比如:
__init__() # 使用 class_name() 会自动执行初始化函数__init__() __call__() # 使用 instance() 会自动执行__call__() __getitem__() # 执行 instance[key] 时会⾃动触发 __setitem__() # 执⾏ instance[key] = value 时会⾃动触发 __delitem__() # 执⾏del instance[key] 时会⾃动触发 __add__() # 当执行 instance1 + instance2 时会自动触发 __enter__() # 当执行with instance 时会触发,先执行__enter__函数 __exit__() # 执行完with语句退出时执行(with open ...) __str__() # 打印一个对象时返回的时对象的__str__方法 __repr__() # 与repr差不多,返回的格式更为正式(比较偏底层,接近解释器) __hash__ = none # 设置对象为不可hash __hash__() # 自己定制hash计算方法 __len__() # len()调用的就是__len__ __gt__() # 大于或等于 __ge__() # 大于 __lt__() # 小于或等于 __le__() # 小于 __eq__() # 等于