1. 程式人生 > >python面向初識面向物件-day21

python面向初識面向物件-day21

現在有個需求,需要製作一個人狗大戰遊戲
角色

    基礎屬性
        name
        sex
        hp
        mp
        ad

    基礎屬性
        name
        kind
        hp
        ad
生成這些角色的屬性需要字典
bob = {'name':'bob','sex':'man','hp':10,'mp':10,'ad':1}
dog = {'name':'新新','kind':'金毛','hp':99999,'ad':99999}
如果是多人多狗遊戲,我們需要給每個人都建立字典,太麻煩而且字典的key無法固定

所以我們製造一個模子,刻畫一個人應該有的屬性,固定屬性和key值
def Person(name,sex,hp,mp,ad):
    info_dic = {'name':name,'sex':sex,'hp':hp,'mp':mp,'ad':ad}
    return info_dic

def attack(person,dog):
    print('%s攻擊了%s'%(person['name'],dog['name']))
    dog['hp'] -= person['ad']

def Dog(name,kind,hp,ad):
    info_dic = {'name':name,'kind':kind,'hp':hp,'ad':ad}
    return info_dic

def bite(dog,person):
    print('%s咬了%s'%(dog['name'],person['name']))
    person['hp'] -= dog['ad']

alex = Person('alex','man',10,10,0.1)
print(alex)
yuan = Person('yuan','male',100,100,1)
print(yuan)
jin = Dog('新新','金毛',9999,9999)
print(jin)
attack(alex,jin)
print(jin['hp'])
bite(jin,alex)
bite(alex,jin)

上邊的例子可以改寫成
def Person(name,sex,hp,mp,ad):
    person = {'name':name,'sex':sex,'hp':hp,'mp':mp,'ad':ad}
    def attack(dog):
        print('%s攻擊了%s'%(person['name'],dog['name']))
        dog['hp'] -= person['ad']
    person['attack'] = attack
    return person
def Dog(name,kind,hp,ad):
    dog = {'name':name,'kind':kind,'hp':hp,'ad':ad}
    def bite(person):
        print('%s咬了%s'%(dog['name'],person['name']))
        person['hp'] -= dog['ad']
    dog['bite'] = bite
    return dog
alex = Person('alex','man',10,10,0.1)
jin = Dog('新新','金毛',9999,9999)
print(alex)
alex['attack'](jin)
print(jin)
jin['bite'](alex)

通過上邊的事例可以發現
面向物件程式設計
    人狗大戰
    角色分開:人-狗
    人的基礎屬性給人:人模子
    狗的基礎屬性給狗:狗模子

模子:類(抽象的)
框架,不是具體的擁有某些屬性值的物體
而是規範一類物體有哪些共同的屬性和方法

呼叫模子得到的結果:物件(具體的值)
根據模子的規範,填上具體的值就是一個物件
python中一切皆物件

 

類的定義方法:(類只做兩件事,例項化物件(物件=類名()),檢視類中的屬性(類名.(靜態/類)屬性名())
class 類名(首字母大寫):
    類體
物件名 = 類名(例項化過程的值)
例子
    class Person:
        pass
    print(Person)
結果
    <class '__main__.Person'>

object 物件=類名

例子:
    class Person:
        pass
    a = Person()
    print(a)
結果
    <__main__.Person object at 0x00000164423AEA90>

class Person:
    def __init__(self,name,sex,hp,mp,ad):
    #本身就存在的內建方法
    #self是一塊記憶體空間
        print(name,sex,hp,mp,ad)
bob = Person('bob','man',10,10,0.1)
類名()相當於執行類中的__init__方法

但self與bob有什麼關係呢?
    class Person:
        AAA = 'Linux'   #靜態屬性/類屬性(屬於類的,所有屬於這個類的物件都共這個共同的屬性)
        def __init__(self,name,sex,hp,mp,ad):
            self.name = name    #屬性,屬性物件的值(物件屬性)
            self.sex = sex
            self.hp = hp
            self.mp = mp
            self.ad = ad
    bob(物件) = Person('bob','man',10,10,0.1) #例項化
    yuan = Person('yuan','male',100,100,2)
    print('bob--->',bob)
    # 類 -->例項化-->物件(例項)
    print(bob.name)
    print(bob.sex)
    print(bob.hp)
    print(bob.mp)
    print(bob.ad)
    print('bob,yuan',bob,yuan)
    print(Person.AAA,bob.AAA)
結果
    bob---> <__main__.Person object at 0x000001D9A3824780>
    bob
    man
    10
    10
    0.1
    bob,yuan <__main__.Person object at 0x000001D9A3824780> <__main__.Person object at 0x000001D9A38247F0>
    Linux Linux

呼叫
    class Person:
        def __init__(self,name,sex,hp,mp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.mp = mp
            self.ad = ad
        def attack(self):   #動態屬性,一個函式在類當中定義函式就是方法,方法自帶self引數
            print('%s發起了攻擊'%self.name)
    bob = Person('bob','man',10,10,0.1)
    bob.attack()    #Person.attack(bob)
結果
    bob發起了攻擊


物件能夠完成的事情
    操作物件的屬性
    呼叫物件的方法
類:具有相同屬性和方法的一類事務(框架 模子)
物件
    物件是類中一個具體的例子(擁有具體的屬性值和具體的方法)
    物件就是類的例項化,類的例項
例項:例項完全和物件是一樣的
例項化:是由類建立物件的過程
類名能做什麼?
    例項化
    呼叫類中的靜態屬性
例項化的過程: 物件名 = 類名(引數)
    1.建立一個屬於物件的空間
    2.將這個空間的地址和引數傳遞給__init__方法
    3.執行init方法
    4.將物件的空間返回給物件名
靜態屬性: 所有的這個類的物件都共有的屬性\
物件能做什麼?
    呼叫物件的屬性
    呼叫類中的方法(動態屬性)
物件的屬性: 儲存在例項化之後建立的空間中的所有變數都是物件的屬性
            每一次例項化產生的空間都是獨立的,每一個物件都有自己的屬性值
動態屬性: 定義在類中的函式,自帶一個self,就是呼叫這個方法的物件本身

 

物件的屬性操作
class Person:
    def __init__(self,name,sex,hp,mp,ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.mp = mp
        self.ad = ad
    def attack(self):
        print('%s發起了攻擊'%self.name)

class Dog:
    def __init__(self,name,kind,hp,ad):
        self.name = name
        self.kind = kind
        self.hp = hp
        self.ad = ad

bob = Person('bob',None,10,10,0.1)
jin = Dog('新新','金毛',9999,9999)

print(bob.__dict__)
bob.__dict__['name'] = 'jrey'
print(bob.name)
結果
{'name': 'bob', 'sex': None, 'hp': 10, 'mp': 10, 'ad': 0.1}
jrey


print(bob.hp)

bob.hp = 99
print(bob.hp)

bob.level = 1
print(bob.level)

del bob.level
# print(bob.level)

兩個類的物件之間的互動
# 人打狗,狗掉血  attack
# 狗咬人,人掉血  bite
    class Person:    # 類
        def __init__(self,name,sex,hp,mp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.mp = mp
            self.ad = ad
        def attack(self,dog):
            print('%s攻擊了%s'%(self.name,dog.name))
            dog.hp -= self.ad
    class Dog:
         def __init__(self,name,kind,hp,ad):
             self.name = name
             self.kind = kind
             self.hp = hp
             self.ad = ad
         def bite(self,person):
             print('%s咬人%s'%(self.name,person.name))
             person.hp -= self.ad
             if person.hp <= 0 :
                 print('%s死了'%person.name)
                 person.hp = 0
    #例項化一些物件
    bob = Person('bob',None,10,10,0.1)
    haha = Dog('新新','金毛',9999,998)
    print(haha.hp)
    bob.attack(haha)   # Person.attack(bob,haha)
    print(haha.hp)
    print(bob.hp)
    haha.bite(bob)
    print(bob.hp)
結果
    9999
    bob攻擊了新新
    9998.9
    10
    新新咬人bob
    bob死了
    0