1. 程式人生 > >py---------面向對象基礎篇

py---------面向對象基礎篇

display 技術 cal -- splay 開發人員 實現 分享 local

一、引子

你現在是一家遊戲公司的開發人員,現在你需要開發一款叫做《人貓大戰》的小遊戲,你就思考呀,人貓大戰,那至少需要兩個角色,一個是人,一個是貓,且人和貓有不同的技能,比如人拿棍打狗,狗可以咬人,讓我們來描述這種不同角色和他們的功能?

首先定義初始技能,描述兩個角色

技術分享圖片
#人和狗初始角色1
def Person(name,sex,hp,dps):   # 人模子
    dic = {name:name,sex:sex,hp:hp,dps:dps,bag:[]}
    return dic
def Dog(name,kind,hp,dps):   # 狗模子
    dic = {
name:name,kind:kind,hp:hp,dps:dps} return dic
人和狗初始角色1

定義了兩個模子,遊戲裏的每個人和每只貓擁有相同屬性。具體傳入一個人和一只貓。

技術分享圖片
#生一個人和一條狗具體參數
alex = Person(alex,不詳,250,5)     #一個人alex
ha2 = Dog(小黑,藏獒,15000,200)   #一只貓 小花
生成人和貓具體信

兩個角色對象生成了,狗和人的功能不同,打狗,狗咬人,這時候每一個功能寫一個函數,用哪個功能那個就調用哪個。

技術分享圖片
#######人打狗
def attack(person,dog):
    dog[
hp] -= person[dps] print(%s打了%s,%s掉了%s點血,剩余%s點血%(person[name],dog[name],dog[name],person[dps],dog[hp])) attack(alex,ha2) print(ha2) #原來血量減少了 ####狗咬人 def bite(dog,person): person[hp] -= dog[dps] print(%s咬了%s,%s掉了%s點血,剩余%s點血%(dog[name],person[name],person[name
],dog[dps],person[hp])) bite(ha2,alex) #結果: 小黑咬了alex,alex掉了200點血,剩余50點血 print(alex) #結果: {‘name‘: ‘alex‘, ‘sex‘: ‘不詳‘, ‘hp‘: 50, ‘dps‘: 5, ‘bag‘: []}
attact 和 bite

上面的功能實現的簡直是完美!

但是仔細玩耍一會,你就不小心幹了下面這件事

bite(alex,ha2)   #讓alex咬了小黑,哈哈哈

事實 上,從你寫的代碼上來看,這並沒出錯。很顯然,人是不能調用狗的功能的,但在你的程序例沒有做限制,如何在代碼級別實現這個限制呢?

技術分享圖片
def Person(name,sex,hp,dps):   # 人模子
    dic = {name:name,sex:sex,hp:hp,dps:dps,bag:[]}
    def attack(dog):
        dog[hp] -= dic[dps]
        print(%s打了%s,%s掉了%s點血,剩余%s點血 % (dic[name], dog[name], dog[name], dic[dps], dog[hp]))
    dic[attack] = attack
    return dic

def Dog(name,kind,hp,dps):   # 狗模子
    dic = {name:name,kind:kind,hp:hp,dps:dps}
    def bite(person):
        person[hp] -= dic[dps]
        print(%s咬了%s,%s掉了%s點血,剩余%s點血 % (dic[name], person[name], person[name], dic[dps], person[hp]))
    dic[bite] = bite
    return dic
alex = Person(alex,不詳,250,5)
ha2 = Dog(哈士奇,藏獒,15000,200)

# 人打狗
print(ha2)   #打狗錢‘hp‘: 15000
print(alex[attack])   #屬於Person.<locals>局部組的函數
alex[attack](ha2)  #alex 打狗

print(ha2)   #打狗後‘hp‘: 14995

#alex[‘bite‘](ha2)    #alex 咬狗這會就報錯啦
限制alex咬狗的全新代碼

py---------面向對象基礎篇