类与类之间的关系

# 类与类之间的关系
# 依赖关系
# 大象走进冰箱并关门
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中找
原文地址:https://www.cnblogs.com/shawnhuang/p/10276882.html