類與類之間的關係

類與類之間的關係

1、依賴關係

  • 在方法中給方法傳遞一個對象
  • 此種關係,類與類之間的關係是最輕的
# 植物大戰殭屍
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

2、關聯關係

  • 兩種事物必須是互相關聯的,可是在某些特殊狀況下是能夠更改和更換的
  • 一對多:一的一方埋集合,多的一方埋實體

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

3、繼承關係

  • 在具體繼承關係中,訪問方法時,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:app

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:spa

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
相關文章
相關標籤/搜索