Day-16 面向对象03 类与类之间的关系

一、类与类之间的依赖关系

  我用着你,但是你不属于我,这种关系是最弱的,比如,公司和雇员之间,对于正式员工,肯定要签订劳动合同,还得小心伺候着,但是如果是兼职,那无所谓,需要了你就来,不需要你就可以拜拜了,这里的兼职(临时工)就属于依赖关系

class Elphant:
    def __init__(self, name):
        self.name = name

    def open(self, ref):
        print("大象要开门了. 默念三声. 开!")
        # 由外界传递进来一个冰箱, 让冰箱开门. 这时. 大象不用背着冰箱到处跑.
        # 类与类之间的关系也就不那么的紧密了. 换句话说. 只要是有open_door()方法的对象. 都可以接收运行
        ref.open_door()
 

    def close(self, ref):
        print("大象要关门了. 默念三声. 关!")
        pass

    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.组合关系:属于关联关系中的一种特例,写法上差不多,组合关系比聚合还要紧密,比如人的大脑,心脏,各个器官,这些器官组合成一个人,这是人如果挂了,其他东西也跟着挂了。

三、继承关系

  在面向对象的世界中存在着继承关系. 我们现实中也存在着这样的关系. 我们说过. x是一种y, 那x就可以继承y。

扫描二维码关注公众号,回复: 5675040 查看本文章

  首先, 类名和对象默认是可以作为字典的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

猜你喜欢

转载自www.cnblogs.com/xiaomai-rhce/p/10605008.html