Python的类和继承
一、类的封装:
- 封装将类的信息隐藏在类内部,不允许外部直接修改该类的变量,只能通过该类提供的方法来实现对隐藏信息的操作和访问
class Boss():
# 类的公共属性
level=1
# 类的初始化(构造方法),在类实例化时自动调用。
def __init__(self,name,hp,sp,atk):
self.name = name
self.hp = hp
self.sp = sp
self.atk = atk
# 创建类的方法,Boss被击中时HP减少
def boss_hp_reduce(self,hero_atk):
# 被击中时HP减少
self.hp -= hero_atk
print("Boss受到了%d点伤害" % hero_atk)
print("Boss现在的生命为%d" % self.hp)
# 攻击到hero时,heroHP减少
def boss_attack(self,hero_hp):
hero_hp -= self.atk
print("Hero受到了%d点伤害" % self.atk)
print("Hero现在的血量为%d" % hero_hp)
# 当Boss魔力值充满时,释放大招
def boss_sp_full(self):
print("Boss:哈哈,我放大招了")
print("Hero被击飞!受到了99999伤害")
print("Hero阵亡了")
# 设定hero的属性,同样可以使用类封装,但是我懒得弄了
hero_atk = 100
hero_hp = 1000
# 创建一个实例
boss = Boss("icedemon",10000,5,350)
# 调用实例的方法
boss.boss_hp_reduce(hero_atk)
boss.boss_attack(hero_hp)
boss.boss_sp_full()
输出结果如下:
>>> Boss受到了100点伤害
>>> Boss现在的生命为9900
>>> Hero受到了350点伤害
>>> Hero现在的血量为650
>>> Boss:哈哈,我放大招了
>>> Hero被击飞!受到了99999伤害
>>> Hero阵亡了
二、类的继承:
- 从父类继承,继承可以让子类从父类获取特征(属性和方法)
- 在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用,子类可以定义自己的属性和方法
class Enemy():
def __init__(self,name,hp,atk):
self.name = name
self.hp = hp
self.atk = atk
def attack(self):
print("%s发起攻击,hero受到了%d点伤害!" % (self.name,self.atk))
# 继承Enemy类
class Enemy2(Enemy):
pass
# 创建实例
enemy = Enemy("毛毛虫",10,2)
enemy1 = Enemy2("小鸡",100,10)
enemy.attack()
enemy1.attack()
父类:Enemy就是Enemy2的父类,也成为基类,超类
子类:Enemy2就是Enemy的子类,也成为派生类
如果未定义时,等同于继承object,在Python中,object是所有类的父类
运行结果
>>> 毛毛虫发起攻击,hero受到了2点伤害!
>>> 小鸡发起攻击,hero受到了10点伤害!
三、类的继承之Super()函数
- 如果子类继承父类不做初始化,那么会自动继承父类属性。
- 如果子类继承父类做了初始化,且不调用super初始化父类构造函数,那么子类不会自动继承父类的属性。
- 如果子类继承父类做了初始化,且调用了super初始化了父类的构造函数,那么子类也会继承父类的属性。
class Enemy():
def __init__(self):
self.name = "蜜蜂"
self.level = 1
def summary(self):
print("%s,等级为%d" % (self.name,self.level))
# 一般来说子类做了初始化就不能继承父类的属性,但可以利用super函数
class Enemy2(Enemy):
def __init__(self):
self.name = "蜘蛛"
self.level = 5
super().__init__()
# 已经初始化的子类不再继承父类的属性,已经存在的方法也是
class Enemy3(Enemy):
def __init__(self):
self.name = "蝴蝶"
self.level = 2
def summary(self):
print("%s,等级为%d" % (self.name,self.level))
enemy = Enemy()
enemy2 = Enemy2()
enemy3 = Enemy3()
enemy.summary()
enemy2.summary()
enemy3.summary()
输出结果:
>>> 蜜蜂,等级为1
>>> 蜜蜂,等级为1
>>> 蝴蝶,等级为2