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


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

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

     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

  • 相关阅读:
    Java反射之访问私有属性或方法
    java字符串中显示双引号
    什么导致spring事务失效
    ActiveMq性能优化
    JFrame关闭事件处理
    c3p0数据库连接池死锁问题
    Mongodb性能优化
    Spring事务配置的五种方式
    ActiveMq启动停止
    JScrollPane动态加载图片
  • 原文地址:https://www.cnblogs.com/minusone/p/9931950.html
Copyright © 2020-2023  润新知