继承,派生
一、继承
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方法,并且添加了一些特有的属性,比如我添加了一行打印语句,
这种在拥有相同的属性的前提下,新添加的属性或功能就是派生。
共有 0 条评论