• Python进阶编程 类与类的关系


    类与类的关系

    依赖关系

    # 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
    class Elephant:
        def __init__(self, name):
            self.name = name
        def open(self,r1):
            # print(ref1)
            print(f'{self.name}默念三声: 芝麻开门')
            r1.open_door()
        def close(self):
            print('大象默念三声:芝麻关门')
    class Refrigerator:
        def __init__(self, name):
            self.name = name
        def open_door(self):
            print(f'{self.name}冰箱门被打开了....')
        def close_door(self):
            print('冰箱门被关上了....')
    e1=Elephant('大象')
    r1=Refrigerator('海尔冰箱')	
    e1.open(r1)		#将一个类的类名或者对象传给另一个类的方法中.产生了依赖关系
    

    组合关系

    组合: 将一个类的对象封装成另一个类的对象的属性.

    class Boy:
        def __init__(self, name):
            self.name = name
        def meet(self, girl_friend=None):
            self.girl_friend = girl_friend  # wu对象空间 : girl_friend : object对象
        def have_diner(self):  # self = wu这个对象空间
            if self.girl_friend:
                print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
                self.girl_friend.shopping(self)  # (self = wu对象空间)
            else:
                print('单身狗,吃什么吃')
    class Girl:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def shopping(self,boy_friend):
            print(f'{boy_friend.name},{self.name}一起去购物!')
    wu = Boy('吴超')
    flower = Girl('如花', 48)
    # 组合: 将一个类的对象封装成另一个类的对象的属性.
    wu.meet(flower)
    wu.have_diner()
    
    

    继承关系

    继承的优点:

    1,增加了类的耦合性(耦合性不宜多,宜精)。

    2,减少了重复代码。

    3,使得代码更加规范化,合理化

    继承:可以分单继承,多继承

    单继承

    第一种:直接执行

    class Aniaml(object):
        type_name = '动物类'
    
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print(self)
            print('吃东西')
    class Person(Aniaml):
        pass
    P1=Person('alex','男','18')
    # 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找
    P1.eat()
    # 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。
    
    

    第二种:子类和父类都有相同功能,都想执行

    class Aniaml(object):
        type_name = '动物类'
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print('吃东西')
    
    class Person(Aniaml):
        def __init__(self,name,sex,age,mind):
            super().__init__(name,sex,age)  # super.__init__  自动帮你把self 传给父类的__init__
            self.mind = mind
    
        def eat(self):
            super().eat()
            print('%s 吃饭'%self.name)
      
            
    p1 = Person('春哥','laddboy',18,'有思想')
    

    多继承

    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    class D(B, C):
        pass
    class E:
        pass
    class F(D, E):
        pass
    class G(F, D):
        pass
    class H:
        pass
    class Foo(H, G):
        pass
    

    新式类的多继承

    MRO是一个有序列表L,在类被创建时就计算出来。
    通用计算公式为:

    mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )(其中Child继承自Base1, Base2)
    

    如果继承至一个基类:class B(A)
    这时B的mro序列为

    mro( B ) = mro( B(A) )
    = [B] + merge( mro(A) + [A] )
    = [B] + merge( [A] + [A] )
    = [B,A]
    

    如果继承至多个基类:class B(A1, A2, A3 …)
    这时B的mro序列

    mro(B) = mro( B(A1, A2, A3 …) )
    = [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
    = ...
    

    计算结果为列表,列表中至少有一个元素即类自己,如上述示例[A1,A2,A3]。merge操作是C3算法的核心。

    4.2.2. 表头和表尾
    表头:
      列表的第一个元素

    表尾:
      列表中表头以外的元素集合(可以为空)

    示例
      列表:[A, B, C]
      表头是A,表尾是B和C

    4.2.3. 列表之间的+操作
    +操作:

    [A] + [B] = [A, B]
    (以下的计算中默认省略)
    ---------------------

    merge操作示例:

    如计算merge( [E,O], [C,E,F,O], [C] )
    有三个列表 :  ①      ②          ③
    
    1 merge不为空,取出第一个列表列表①的表头E,进行判断                              
       各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
    2 取出列表②的表头C,进行判断
       C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
       merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
    3 进行下一次新的merge操作 ......
    --------------------- 
    
  • 相关阅读:
    汇编语言之第三章寄存器(内存访问)
    汇编语言之第一章基础知识
    汇编语言之实验二
    python爬虫——利用BeautifulSoup4爬取糗事百科的段子
    电子表格拼接助手
    龙龙背作文V1.0——考研英语作文专项训练软件
    龙龙记单词V1.1——更美,更多,更强
    书签小助手V1.0发布了
    龙龙排短文V1.0——考研英语排序题专项训练软件
    保定市公交换乘离线查询系统
  • 原文地址:https://www.cnblogs.com/llwwhh/p/11318027.html
Copyright © 2020-2023  润新知