首页 » 编程 » Python-5.面向对象编程设计与开发 » 正文

继承,派生

一、继承

 

class ParentClass1:
    pass


class ParentClass2:
    pass


class SubClass1(ParentClass1):
    pass


class SubClass2(ParentClass1, ParentClass2):
    pass


# 查看SubClass1继承的父类
print(SubClass1.__bases__)  # 输出:(<class '__main__.ParentClass1'>,)

# 查看SubClass2继承的父类
print(SubClass2.__bases__)  # 输出:(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

 

使用继承简化之前的小练习:

class Hero:
    def __init__(self, nickname, life_value, aggresivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggresivity = aggresivity

    def attack(self, enemy):
        enemy.life_value -= self.aggresivity


class Garen(Hero):
    pass


class Riven(Hero):
    pass


g1 = Garen("alex", 29, 30)  # 实例化
print(g1.nickname, g1.life_value, g1.aggresivity)  # 输出:alex 29 30

r1 = Riven("jack", 40, 40)  # 实例化
print(r1.nickname, r1.life_value, r1.aggresivity)  # 输出:jack 40 40

print(r1.life_value)  # r1被攻击之前生命值:40
g1.attack(r1)  # g1攻击r1
print(r1.life_value)  # r1被攻击后生命值:10

 

使用继承后的属性查找顺序:

class Foo:
    def f1(self):
        print("from Foo.f1")

    def f2(self):
        print("from Foo.f2")


class Bar(Foo):
    def f1(self):
        print("from Bar.f1")


b = Bar()
b.f2()  # 输出:from Foo.f2

结果输出 from Foo.f2

因为 b.f2() 首先会到b对象去找,b对象没有就去生成b的类去找 也就是Bar,在Bar中也没有找到,由于Bar是继承Foo的,所以又去Foo里去找,找到了Foo里有f2 ,就执行了f2,假如此时Foo里也没有就报错了。

 

 

二、派生

上面的小游戏的例子中,我们使用继承的方式对程序进行了简化,但是两个英雄角色完全一样了,每个英雄应该还有自己的特征,所以我们给英雄加上特征:

class Hero:
    def __init__(self, nickname, life_value, aggresivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggresivity = aggresivity

    def attack(self, enemy):
        enemy.life_value -= self.aggresivity


class Garen(Hero):
    camp = "Demacia"

    def attack(self, enemy):
        enemy.life_value -= self.aggresivity
        print("在Garen中被攻击了。")


class Riven(Hero):
    camp = "Noxus"


g1 = Garen("alex", 29, 30)
r1 = Riven("jack", 40, 40)
print(g1.camp, g1.nickname, g1.life_value, g1.aggresivity)  # 输出:Demacia alex 29 30
print(r1.camp, r1.nickname, r1.life_value, r1.aggresivity)  # 输出:Noxus jack 40 40

camp 就是给各个英雄添加的新属性,而每个英雄的camp又不一样,使得每个英雄有自己的特征,

此外在Garen函数中我们还写了一个 attack方法,并且添加了一些特有的属性,比如我添加了一行打印语句,

这种在拥有相同的属性的前提下,新添加的属性或功能就是派生。

 

 

发表评论

验证码加载中....