python 依赖关系 与关联关系

#简单版本(依赖关系)
# class Daxiang():
#     def open(self,door):
#         print('我是大象,我想开门')
#         door.open()
#         print('谢谢,你帮我开门!!!')
#
#     def zhuang(self):
#         print('门已经开了,那我就进去了')
#     def close(self,door):
#         print('我已经进去了,帮我关门')
#         door.close()
#         print('谢谢帮我关门,我呀死了')
#
# class Door:
#     def open(self):
#         print('我是门,是叫我开门吗?那我开了')
#
#     def close(self):
#         print('我是门,你确定关门吗?马上就关')
#
# D = Door()
# gg = Daxiang()
# gg.open(D)
# gg.zhuang()
# gg.close(D)
# # 以某个对象为主体,主体要使用副体的某个功能,任何的对象只要拥有这个功能的,都能成为这个副体 》》》 那么主体与副体的关系就是 依赖关系

 

加强版(依赖关系)

class Zombie:
    def __init__(self,name,attrack,hp):
        self.name = name
        self.attrack = attrack
        self.hp = hp
    def Attrack_To_Plant(self,P):
        P.hp -= self.attrack
        if P.hp <= 0:
            print('真惨,你一阵亡')
        else:
            print('注意,你还剩余的血量是%s' % P.hp)

zicai = Plant('紫菜',10,100)  #创建一个植物的对象
zombie1 = Zombie('僵尸1',5,100)#创建一个僵尸的对象
zicai.Attrack(zombie1) #紫菜攻击僵尸1 一次
zicai.Attrack(zombie1) #紫菜攻击僵尸1 一次
zicai.Attrack(zombie1) #紫菜攻击僵尸1 一次
zicai.Attrack(zombie1) #紫菜攻击僵尸1 一次
zombie1.Attrack_To_Plant(zicai)#僵尸攻击紫菜

 

关联关系

class Person:
    def __init__(self,name,Bag=None):
        self.name = name
        self.bag = Bag

    def GTA(self):
        if self.bag:
            print('%s 你在干啥,还不带上你的%s去干啥'%(self.name,self.bag.name))
        else:
            print('连个包都没有,还能去哪')

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

gg = Person('小明')
New_bag = BB('书包')
gg.bag = New_bag
gg.bag = 0
gg.GTA()

# 关联关系:主体的某个属性 是一个对象(副体) ,这个对象在赋值给主体的属性之后,相当属于主体的一部分,如果主体要使用副体的功能
可以直接通过属性找到该对象之后,进行功能的调用就可以了

加强版(关联关系)

class Teacher:
    def __init__(self,name,lst=None):
        self.name = name
        if lst == None:
            self.lst = []
        else:
            self.lst = lst
    def Append(self,s):
        self.lst.append(s)

class Student:
    def __init__(self,No,name,age):
        self.name = name
        self.No = No
        self.age = age

T1 = Teacher('小沈阳')
print(T1.name)
print(T1.lst)
S1 = Student(1,'Luffy',18)
S2 = Student(2,'Luffy2',18)
S3 = Student(3,'Luffy3',18)
S4 = Student(4,'Luffy4',18)
T1.Append(S1)
T1.Append(S2)
for i in T1.lst:
    print(i.name)
View Code

 

继承关系:self在访问方法时候,现在自己的命名空间查找,如果在自己的命名空间找不到的话,再到父类的命名空间

去查找,如果在父类都还找不到的话,就出相应的报错。

同时注意的是哪个对象一开始进行调用方法的,self就是那个对象,即使对象本身没有该方法,通过继承关系到父类查找

名称相同的方法进行调用的时候,self也没有没有变的

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.func2()

结果:
111 1
111 2
222 3
View Code

 

posted @ 2018-11-08 21:35  好大一个圈  阅读(1103)  评论(0编辑  收藏  举报