一、类与类之间的依赖关系
我用着你,但是你不属于我,这种关系是最弱的,比如,公司和雇员之间,对于正式员工,肯定要签订劳动合同,还得小心伺候着,但是如果是兼职,那无所谓,需要了你就来,不需要你就可以拜拜了,这里的兼职(临时工)就属于依赖关系
1 class Elphant: 2 def __init__(self, name): 3 self.name = name 4 5 def open(self, ref): 6 print("大象要开门了. 默念三声. 开!") 7 # 由外界传递进来一个冰箱, 让冰箱开门. 这时. 大象不用背着冰箱到处跑. 8 # 类与类之间的关系也就不那么的紧密了. 换句话说. 只要是有open_door()方法的对象. 都可以接收运行 9 ref.open_door() 10 11 12 def close(self, ref): 13 print("大象要关门了. 默念三声. 关!") 14 pass 15 16 def take(self): 17 print("钻进去") 18 19 20 class Refrigerator: 21 22 def open_door(self): 23 print("冰箱门被打开了") 24 def close_door(self): 25 print("冰箱门被关上了") 26 27 28 # 造冰箱 29 r = Refrigerator() 30 31 # 造大象 32 el = Elphant("神奇的大象") 33 el.open(r) # 注意. 此时是把一个冰箱作为参数传递进去了. 也就是说. 大象可以指定任何一个冰箱. 34 el.take() 35 el.close(r)
二、关联关系、组合关系、聚合关系
1.关联关系:两种事物必须是互相关联的,但是在某些特殊情况下是可以更改和更换的。此时类与类之间的关系是最轻的
2.聚合关系:属于关联关系中的一种特例,侧重点是xxx和xxx聚合成xxx,各自有各自的声明周期,比如电脑,电脑里有CPU,硬盘,内存等等,电脑挂了,CPU还是好的,还是完整的个体。
3.组合关系:属于关联关系中的一种特例,写法上差不多,组合关系比聚合还要紧密,比如人的大脑,心脏,各个器官,这些器官组合成一个人,这是人如果挂了,其他东西也跟着挂了。
三、继承关系
在面向对象的世界中存在着继承关系. 我们现实中也存在着这样的关系. 我们说过. x是一种y, 那x就可以继承y。
首先, 类名和对象默认是可以作为字典的key的
class Foo: def __init__(self): pass def method(self): pass # __hash__ = None print(hash(Foo)) print(hash(Foo()))
既然可以hash. 那就是说字典的key可以是对象或者类
dic = {} dic[Foo] = 123 dic[Foo()] = 456 print(dic) # {<class '__main__.Foo'>: 123, <__main__.Foo object at 0x103491550>: 456}
接下来. 我们来继续研究继承上的相关内容. 在本节中主要研究一下self. 记住. 不管方法之
间如何进行调用. 类与类之间是何关系. 默认的self都是访问这个方法的对象.
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在访问方法的顺序:永远先找自己的,自己的找不到再找父类的
四、类中的特殊成员
什么是特殊成员呢?__init__就是一个特殊的成员,说白了,带双下划线的那一坨,这些方法在特殊的场景的时候会被自动的执行,比如:
1.__init__ 初始化方法
2.__str__ 打印对象时,默认输出该方法返回值
3.__new__ 构造方法
4.__enter__和__exit__ with 对象 as 变量 会自动执行该方法
5.__hash__ 打印对象哈希值
6.__add__ 实现加法操作
7.__mul__ 实现乘法操作
8.__bool__ 实现真假值操作
9.__iter__ 用于迭代器
10.__del__ 释放内存
11.__getitem__ 用于索引操作,如字典,获取数据
12.__setitem__ 用于索引操作,如字典,设置数据
13.__delitem__ 用于索引操作,如字典,删除数据
14.__getslice__ 用于切片操作,如列表,获取数据
15.__setslice__ 用于切片操作,如列表,设置数据
16.__delslice__ 用于切片操作,如列表,删除数据
17.__eq__ 判断对象的值是否相等
创建对象的真正步骤:
首先,在执行类名()的时候,系统会自动先执行__new__()来开辟内存,此时新开辟出来的内存区域为空的,紧随其后,系统自动调用__init__()来完成对象的初始化工作,按照时间轴来算。
1.加载类
2.开辟内存(__new__)
3.初始化(__init__)
4.使用对象干xxxxx