类与类之间的关系

类与类之间的关系

一、依赖关系

  • 在方法中给方法传递一个对象
  • 此种关系,类与类之间的关系是最轻的
# 植物大战僵尸
class Plant(object):
    """
    植物类
    """
    def __init__(self, name, attack, hp):
        """
        初始化
        :param name:植物名
        :param attack: 攻击力
        :param hp: 血量
        """
        self.name = name
        self.attack = attack
        self.hp = hp

    def fight(self, zombie):
        """
        攻击js,使js掉血
        :param js: 攻击对象
        :return: None
        """
        zombie.hp -= self.attack


class Zombie(object):
    """
    僵尸类
    """
    def __init__(self, name, hp, attack):
        """
        初始化
        :param name: 僵尸名
        :param hp: 血量
        :param attack: 攻击力
        """
        self.name = name
        self.hp = hp
        self.attack = attack

    def eat(self, plant):
        """
        僵尸吃plant
        :param plant: 吃的对象
        :return: None
        """
        plant.hp -= self.attack


lvluo = Plant("绿萝", 20, 100)
js1 = Zombie("僵尸1号", 100, 5)

lvluo.fight(js1)
js1.eat(lvluo)

print(lvluo.hp)  # 95
print(js1.hp)    # 80

二、关联关系

  • 两种事物必须是互相关联的,但是在某些特殊情况下是可以更改和更换的
  • 一对多:一的一方埋集合,多的一方埋实体

1)  一对一关系

class Person(object):
    """
    Person类
    """
    def __init__(self, name, id=None):
        """
        初始化
        :param name: 姓名
        :param id: 身份证号码
        """
        self.name = name
        self.id = id

    def display(self):
        """
        展示有无身份证
        :return: None
        """
        if self.id:
            print("我叫%s, 我的身份证号码为%s" % (self.name, self.id))
        else:
            print("我未成年,没有身份证!!!")


class Id(object):
    """
    Id类
    """
    def __init__(self, name, num):
        """
        初始化
        :param name: 姓名
        :param num: 身份证号
        """
        self.name = name
        self.num = num


p_id = Id("Tom", 123456789)
p1 = Person("Tom", p_id.num)
p1.display()  # 我叫Tom, 我的身份证号码为123456789

2) 一对多关系

class Teacher(object):
    """
    Teacher类
    """
    def __init__(self, name, lst=None):
        """
        初始化
        :param name: 姓名
        :param lst: 学生列表
        """
        self.name = name
        if lst == None:
            self.lst = []
        else:
            self.lst = lst

    def add(self, student):
        """
        添加学生
        :param student: 学生对象
        :return: None
        """
        self.lst.append(student)

    def display(self):
        """
        打印学生姓名
        :return: None
        """
        for el in self.lst:
            print(el.name)


class Student(object):
    """
    Student类
    """
    def __init__(self, name, num):
        """
        初始化
        :param name: 姓名
        :param num: 学号
        """
        self.name = name
        self.num = num

# 创建对象
t = Teacher("Tom")
s1 = Student("andy", 1)
s2 = Student("Linda", 2)

# 把学生添加给老师
t.add(s1)
t.add(s2)

t.display()

结果:
andy
Linda

三、继承关系

  • 在具体继承关系中,访问方法时,self永远都是指向创建对象时的对象。
class Base(object):
    def __init__(self, num):
        self.num = num
    
    def func1(self):
        print(self.num)


class Foo(Base):
    pass

obj = Foo(123)  # 调用__init__方法,自己没有,找父类
obj.func1()  # 123

 Next:

class Base(object):
    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

 Next:

class Base(object):
    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()


结果:
1
111 1
2
111 2
3
222 3

 

posted @ 2018-11-08 20:04  Ethan_Y  阅读(736)  评论(0编辑  收藏  举报