zoukankan      html  css  js  c++  java
  • 类与类之间的关系

    # 类与类之间的关系
    # 依赖关系
    # 大象走进冰箱并关门
    class Elephant:
    
        def __init__(self, name):
            self.name = name
    
        def open(self, obj):  # 给一个类的方法传了另一个类的对象
            print("%s心里默念:1,2,3,开!" % self.name)
            obj.open_door()
    
        def close(self, obj1):
            print("%s心里默念:3,2,1,关!" % self.name)
            obj1.close_door()
    
    class Refrigerator:
    
        def __init__(self, name):
            self.name = name
    
        def open_door(self):
            print("%s冰箱门被大象打开了" % self.name)
    
        def close_door(self):
            print("%s冰箱门被大象关闭了" % self.name)
    
    e1 = Elephant("神奇的大象")
    haier = Refrigerator("海尔")
    e1.open(haier)
    e1.close(haier)
    # 心里默念:1,2,3,开!
    # 冰箱门被大象打开了
    # 心里默念:3,2,1,关!
    # 冰箱门被大象关闭了
    
    # 依赖关系:给一个类的方法传了一个参数,此参数是另一个类的对象(类名)
    # 这种依赖关系是所有关系中紧密型最低的,耦合性最低的
    # 你中有我,我中没你
    # 关联关系
    class Boy:
    
        def __init__(self, name, girlfriend=None):
            self.name = name
            self.girlfriend = girlfriend
    
        def eat(self):
            if self.girlfriend:
                print("%s和%s一起吃饭" % (self.name, self.girlfriend.name))
            else:
                print("一个人不吃了")
    
        def append_girl(self, girl):
            self.girlfriend = girl
    
        def remove_girl(self, girl):
            self.girlfriend = None
    
    class Girl:
    
        def __init__(self, name):
            self.name = name
    
    # 传一个参数表示 girlfriend 默认是 None
    b1 = Boy("alex")
    b1.eat()  # 一个人不吃了
    
    g1 = Girl("如花")
    b1.append_girl(g1)
    b1.eat()  # alex和如花一起吃饭
    
    g2 = Girl("金莲")
    b2 = Boy("武大", g2)
    b2.eat()  # 武大和金莲一起吃饭
    
    g3 = Girl("金莲")
    b3 = Boy("武大", g3)
    b3.remove_girl(g3)
    b3.eat()  # 一个人不吃了
    
    # 关联关系是你中有我中有你
    class School:
    
        def __init__(self, name, address):
            self.name = name
            self.address = address
            self.teacher_list = []
    
        def append_teacher(self, teacher):
            self.teacher_list.append(teacher)
    
    class Teacher:
    
        def __init__(self, name, comment, school):
            self.name = name
            self.comment = comment
            self.school = school
    
        def check_address(self):
            print("%s在%s教学" % (self.name, self.school.address))
    
    s1 = School("老男孩北京校区", "美丽富饶的沙河")
    s2 = School("老男孩上海校区", "上海漳江新区")
    s3 = School("老男孩深圳校区", "南山区平山村儿")
    
    t1 = Teacher("太白", "优秀", s1)
    t2 = Teacher("李白", "优秀", s2)
    t3 = Teacher("李黑", "", s3)
    
    t1.check_address()  # 太白在美丽富饶的沙河教学
    print(t1.school.address)  # 美丽富饶的沙河
    
    s1.append_teacher(t1)
    s1.append_teacher(t2)
    s1.append_teacher(t3)
    print(s1.teacher_list)
    # [<__main__.Teacher object at 0x00000159D17644E0>,
    # <__main__.Teacher object at 0x00000159D1764518>,
    # <__main__.Teacher object at 0x00000159D1764550>]
    for i in s1.teacher_list:
        print(i.name)
    # 太白
    # 李白
    # 李黑
    # 单继承的练习
    
    class Base:
    
        def __init__(self, num):
            self.num = num
    
        def func1(self):  # 这里的 self 是 obj
            print(self)
            print(self.num)  # obj.num
    
    class Foo(Base):
        pass
    
    obj = Foo(123)
    obj.func1() # 123
    # 运⾏的是Base中的func1
    class Base:
    
        def __init__(self, num):  # self 就是 obj
            self.num = num  # 给对象空间封装属性,123
    
        def func1(self):
            print(self.num)
    
    class Foo(Base):
    
        def func1(self):
            print("Foo. func1", self.num)
    
    obj = Foo(123)  # 实例化一个对象,产生obj对象空间,这里没有__init__,找父类
    obj.func1() # Foo. func1 123 运⾏的是Foo中的func1
    class Base:
    
        def __init__(self, num):
            self.num = num
    
        def func1(self):  # 这里的 self 就是 obj
            print(self.num)
            self.func2()  # 相当于 obj.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是⼦类中的
    class Base:
    
        def __init__(self, num):
            self.num = num
    
        def func1(self):
            print(self.num)
            self.func2()
    
        def func2(self):
            print(111, self.num)
    
    class Foo(Base):
    
        def func2(self):
            print(222, self.num)
    
    lst = [Base(1), Base(2), Foo(3)]  # Base(1) 是对父类Base实例化一个对象
    for obj in lst:
        obj.func2() # 111 1 | 111 2 | 222 3
    
    # 第一次循环:Base(1), 找Base类, self.num = 1
    # 然后执行 Base(1)的func2()
    # 依次类推
    class Base:
    
        def __init__(self, num):
            self.num = num
    
        def func1(self):
            print(self.num)
            self.func2()
    
        def func2(self):
            print(111, self.num)
    
    class Foo(Base):
    
        def func2(self):
            print(222, self.num)
    
    lst = [Base(1), Base(2), Foo(3)]
    for obj in lst:
        obj.func1() # 那笔来吧. 好好算
    # 第一次: obj = Base(1), obj.num = 1, 然后执行Base中的 func1
    # 此时,func1 中的 self.func2() 执行的是 Base 中的 func2()
    # 依次类推,注意,最重要的是要知道 obj 是属于哪个类的
    class A:
    
        def __init__(self):
            self.func1()
    
        def func1(self):
            print("in A func1")
    
    class B(A):
    
        def func1(self):
            print("in B func1")
    
    obj = B()
    obj.func1()
    # 还是那句话,最重要的是确定 obj 是哪个类的实例化对象!!!
    # 多继承
    
    class A:
        def __init__(self, name):
            self.name = name
    
        def func(self, w):
            self.w = w
    
    class B(A):
        pass
    
    b = B("wusir")
    # 注意这里的括号里必须加一个参数,因为b必须在__init__中执行,但B里面没有__init__,因此会在A中找
  • 相关阅读:
    Alpha冲刺(5/10)
    Alpha冲刺(4/10)
    团队现场编程
    关于合同标准形的专题讨论
    关于相似标准形的专题讨论
    关于数学分析的计算题I(积分)
    关于数学分析的证明题III(级数)
    关于数学分析的证明题II(微分)
    关于数学分析的证明题I(积分)
    关于反常积分收敛的专题讨论
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10276882.html
Copyright © 2011-2022 走看看