一、類的封裝: 封裝將類的信息隱藏在類內部,不允許外部直接修改該類的變數,只能通過該類提供的方法來實現對隱藏信息的操作和訪問 class Boss(): # 類的公共屬性 level=1 # 類的初始化(構造方法),在類實例化時自動調用。 def __init__(self,name,hp,sp,a ...
一、類的封裝:
- 封裝將類的信息隱藏在類內部,不允許外部直接修改該類的變數,只能通過該類提供的方法來實現對隱藏信息的操作和訪問
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