1. 程式人生 > >python全棧開發-面向物件-初識2 python_17_day

python全棧開發-面向物件-初識2 python_17_day

今日主要內容:

  • 1.類空間,物件空間,查詢順序.
  • 2.組合.

1.類空間,物件空間,查詢順序.

class Person:
    animal = '高階動物'
    soul = '有靈魂'
    language = '語言'

    def __init__(self, country, name, sex, age, hight):
        self.country = country
        self.name = name
        self.sex = sex
        self.age = age
        self.hight = hight

    def eat(self):
        print('%s吃飯' % self.name)

    def sleep(self):
        print('睡覺')

    def work(self):
        print('工作')


Person.__dict__['sleep'](111)

p1 = Person('菲律賓','alex','未知',42,175)
p2 = Person('菲律賓','alex','未知',42,175)
p3 = Person('菲律賓','alex','未知',42,175)
p1.animal = '禽獸'
print(p1.animal)

print(Person.name)
p2 = Person('美國','武大','男',35,160)
查詢順序:
  物件.屬性 : 先從物件空間找,如果找不到,再從類空間找,再找不到,再從父類找....
  類名.屬性 : 先從本類空間找,如果找不到,再從父類找....

物件與物件之間是互相獨立的.

2.組合
組合: 給一個類的物件封裝一個屬性,這個屬性是另一個類的物件.

**模擬英雄聯盟寫一個遊戲人物的類(升級題).(見昨日作業) 要求: (1)建立一個 Game_role的類. (2) 構造方法中給物件封裝name,ad(攻擊力),hp(血量).三個屬性. (3) 建立一個attack方法,此方法是例項化兩個物件,互相攻擊的功能: 例: 例項化一個物件 蓋倫,ad為10, hp為100 例項化另個一個物件 劍豪 ad為20, hp為80 蓋倫通過attack方法攻擊劍豪,此方法要完成 '誰攻擊誰,誰掉了多少血, 還剩多少血'的提示功能.

版本一:新增武器:斧子,刀,槍,棍,棒...,
class GameRole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def attack(self,p):
        p.hp = p.hp - self.ad
        print('%s 攻擊 %s,%s 掉了%s血,還剩%s血' %(self.name,p.name,p.name,self.ad,p.hp))

class Weapon:
    def __init__(self,name,ad):
        self.name = name
        self.ad = ad
    def fight(self,p1,p2):
        p2.hp = p2.hp - self.ad
        print('%s 用%s打了%s,%s 掉了%s血,還剩%s血'\
              % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))

p1 = GameRole('張三',20,500)
p2 = GameRole('李四',50,200)
axe = Weapon('三板斧',60)
broadsword = Weapon('屠龍寶刀',100)

axe.fight(p1,p2)
broadsword.fight(p2,p1)

p1.attack(p2)
程式碼不合理: 人物利用武器攻擊別人,你的動作發起者是人,而不是武器.

版本二:
class GameRole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def attack(self,p):
        p.hp = p.hp - self.ad
        print('%s 攻擊 %s,%s 掉了%s血,還剩%s血' %(self.name,p.name,p.name,self.ad,p.hp))

    def armament_weapon(self,wea):
        self.wea = wea


class Weapon:
    def __init__(self,name,ad):
        self.name = name
        self.ad = ad
    def fight(self,p1,p2):
        p2.hp = p2.hp - self.ad
        print('%s 用%s打了%s,%s 掉了%s血,還剩%s血'\
              % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))

p1 = GameRole('張三',20,500)
p2 = GameRole('李四',50,200)
axe = Weapon('三板斧',60)
broadsword = Weapon('屠龍寶刀',100)
# print(axe)
p1.armament_weapon(axe)  # 給張三 裝備了三板斧這個物件.
# print(p1.wea)
# print(p1.wea.name)
# print(p1.wea.ad)
p1.wea.fight(p1,p2)