day20 Pyhton学习 面向对象-类与类之间的关系
一.类与类之间的依赖关系
class Elphant: def __init__(self, name): self.name = name def open(self, ref): print("⼤象要开门了. 默念三声. 开!") # 由外界传递进来一个冰箱, 让冰箱开门. 这时.象不用背着冰箱到处跑. # 类与类之间的关系也就不那么的紧密了. 换句话说. 只要是有open_door()方法的对象. 都可以接收运行 ref.open_door() def close(self, ref): print("⼤象要关门了. 默念三声. 关!") ref.close_door() def take(self): print("钻进去") class Refrigerator: def open_door(self): print("冰箱门被打开了") def close_door(self): print("冰箱门被关上了") # 造冰箱 r = Refrigerator() # 造⼤象 el = Elphant("神奇的⼤象") el.open(r) # 注意. 此时是把这个冰箱作为参数传递进去了. 也就是说.大象可以指定任何一个冰箱. el.take() el.close(r)
此时, 我们说, 大象和冰箱之间就是依赖关系. 我用着你. 但是你不属于我. 这种关系是最弱的.
二.关联关系.组合关系.聚合关系 这三个在代码上写法是一样的. 但是, 从含义上是不一样的.
1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.
2. 聚合关系. 属于关联关系中的一种特例. 侧重点是xxx和xxx聚合成xxx. 各自有各自的声明周期. 比如电脑. 电脑里有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是完整的个体
3. 组合关系. 属于关联关系中的一种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如人的大脑, 心脏, 各个器官. 这些器官组合成一个人. 这时. 人如果挂了. 其他的东西也跟着挂了.
看关联关系: 这个最简单. 也是最常用的一种关系. 比如. 大家都有男女朋友. 男人关联着女朋友. 女人关联着男朋友. 这种关系可以是互相的, 也可以是单方面的.
class Boy: def __init__(self, name, girlFriend=None): self.name = name self.girlFriend = girlFriend def have_a_dinner(self): if self.girlFriend: print("%s 和 %s⼀起去吃晚餐" % (self.name, self.girlFriend.name)) else: print("单身狗. 吃什么饭") class Girl: def __init__(self, name): self.name = name b = Boy("alex") b.have_a_dinner() # 突然牛B了. 找到女朋友了 g = Girl("如花") b.girlFriend = g # 有女朋友了. 6666 b.have_a_dinner() gg = Girl("李⼩花") bb = Boy("wusir", gg) # 娃娃亲. 出生就有女朋友. 服不服 bb.have_a_dinner() # 多么幸福的一家 # 突然.bb失恋了. 娃娃亲不跟他好了 bb.girlFriend = None bb.have_a_dinner() # 又单身了
此时Boy和Girl两个类之间就是关联关系. 两个类的对象紧密练习着. 其中一个没有 了. 另一个就孤单的不得了. 关联关系, 其实就是 我需要你. 你也属于我. 这就是关联关系. 像 这样的关系有很多很多. 比如. 学校和老师之间的关系.
老师必然属于一个学校. 换句话说. 每个老师肯定有一个指定的的工作机构. 就是学校. 那老师的属性中必然关联着学校.
class School: def __init__(self, name, address): self.name = name self.address = address class Teacher: def __init__(self, name, school=None): self.name = name self.school = school s1 = School("⽼男孩北京校区", "美丽的沙河") s2 = School("⽼男孩上海校区", "迪⼠尼旁边") s3 = School("⽼男孩深圳校区", "南⼭区法院欢迎你") t1 = Teacher("金王", s1) t2 = Teacher("银王", s1) t3 = Teacher("海峰", s2) t4 = Teacher("高鑫", s3) # 找到高鑫所在的校区地址 print(t4.school.name)
三.继承关系
class Base: def __init__(self, num): self.num = num def func1(self): print(self.num) self.func2() def func2(self): print("Base.func2") class Foo(Base): def func2(self): print("Foo.func2") obj = Foo(123) obj.func1() # 123 Foo.func2 func1是Base中的 func2是子类中的
self在访问方法的顺序: 永远先找自己的. 自己的找不到再找父类的.
self就是你访问方法的那个对象. 先找自己, 然后在找父类的
创建对象的真正步骤: 首先, 在执行类名()的时候. 系统会自动先执行__new__()来开辟内存. 此时新开辟出来的内存区域是空的. 紧随其后, 系统会自动调用__init__()来完成对象的初始化工作. 按照时间轴来算.
1. 加载类
2. 开辟内存(__new__)
3. 初始化(__init__)
4. 使用对象干xxxxxxxxx
类似的操作还有很多很多. 我们不需要完全刻意的去把所有的特殊成员全都记住. 实战中也用不到那么多. 用到了查就是了.