1. 程式人生 > >屬性查找;綁定到對象的方法的特殊之處;對象之間的交互

屬性查找;綁定到對象的方法的特殊之處;對象之間的交互

mage 不同 too eth 就會 ear method lis 約定

四 屬性查找

類有兩種屬性:數據屬性和函數屬性

1. 類的數據屬性是所有對象共享的

2. 類的函數屬性是綁定給對象用的

技術分享圖片 技術分享圖片
#類的數據屬性是所有對象共享的,id都一樣
print(id(OldboyStudent.school))

print(id(s1.school))
print(id(s2.school))
print(id(s3.school))

‘‘‘
4377347328
4377347328
4377347328
4377347328
‘‘‘



#類的函數屬性是綁定給對象使用的,obj.method稱為綁定方法,內存地址都不一樣
#ps:id是python的實現機制,並不能真實反映內存地址,如果有內存地址,還是以內存地址為準
print(OldboyStudent.learn)
print(s1.learn)
print(s2.learn)
print(s3.learn)
‘‘‘
<function OldboyStudent.learn at 0x1021329d8>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x1021466d8>>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146710>>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146748>>
‘‘‘
技術分享圖片

技術分享圖片

在obj.name會先從obj自己的名稱空間裏找name,找不到則去類中找,類也找不到就找父類...最後都找不到就拋出異常

練習:編寫一個學生類,產生一堆學生對象,要求有一個計數器(屬性),統計總共實例了多少個對象

五 綁定到對象的方法的特殊之處

#改寫
class OldboyStudent:
    school=‘oldboy‘
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def learn(self):
        print(‘%s is learning‘ %self.name) #新增self.name

    def eat(self):
        print(‘%s is eating‘ %self.name)

    def sleep(self):
        print(‘%s is sleeping‘ %self.name)


s1=OldboyStudent(‘李坦克‘,‘男‘,18)
s2=OldboyStudent(‘王大炮‘,‘女‘,38)
s3=OldboyStudent(‘牛榴彈‘,‘男‘,78)

類中定義的函數(沒有被任何裝飾器裝飾的)是類的函數屬性,類可以使用,但必須遵循函數的參數規則,有幾個參數需要傳幾個參數

OldboyStudent.learn(s1) #李坦克 is learning
OldboyStudent.learn(s2) #王大炮 is learning
OldboyStudent.learn(s3) #牛榴彈 is learning

類中定義的函數(沒有被任何裝飾器裝飾的),其實主要是給對象使用的,而且是綁定到對象的,雖然所有對象指向的都是相同的功能,但是綁定到不同的對象就是不同的綁定方法

強調:綁定到對象的方法的特殊之處在於,綁定給誰就由誰來調用,誰來調用,就會將‘誰’本身當做第一個參數傳給方法,即自動傳值(方法__init__也是一樣的道理)

s1.learn() #等同於OldboyStudent.learn(s1)
s2.learn() #等同於OldboyStudent.learn(s2)
s3.learn() #等同於OldboyStudent.learn(s3)

註意:綁定到對象的方法的這種自動傳值的特征,決定了在類中定義的函數都要默認寫一個參數self,self可以是任意名字,但是約定俗成地寫出self。

類即類型

  提示:python的class術語與c++有一定區別,與 Modula-3更像。

  python中一切皆為對象,且python3中類與類型是一個概念,類型就是類

#類型dict就是類dict
>>> list
<class ‘list‘>

#實例化的到3個對象l1,l2,l3
>>> l1=list()
>>> l2=list()
>>> l3=list()

#三個對象都有綁定方法append,是相同的功能,但內存地址不同
>>> l1.append
<built-in method append of list object at 0x10b482b48>
>>> l2.append
<built-in method append of list object at 0x10b482b88>
>>> l3.append
<built-in method append of list object at 0x10b482bc8>

#操作綁定方法l1.append(3),就是在往l1添加3,絕對不會將3添加到l2或l3
>>> l1.append(3)
>>> l1
[3]
>>> l2
[]
>>> l3
[]
#調用類list.append(l3,111)等同於l3.append(111)
>>> list.append(l3,111) #l3.append(111)
>>> l3
[111] 

六 對象之間的交互

class Garen:        #定義英雄蓋倫的類,不同的玩家可以用它實例出自己英雄;
    camp=‘Demacia‘  #所有玩家的英雄(蓋倫)的陣營都是Demacia;
    def __init__(self,nickname,aggressivity=58,life_value=455): #英雄的初始攻擊力58...;
        self.nickname=nickname  #為自己的蓋倫起個別名;
        self.aggressivity=aggressivity #英雄都有自己的攻擊力;
        self.life_value=life_value #英雄都有自己的生命值;
    def attack(self,enemy):   #普通攻擊技能,enemy是敵人;
        enemy.life_value-=self.aggressivity #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值。

我們可以仿照garen類再創建一個Riven類

class Riven:
    camp=‘Noxus‘  #所有玩家的英雄(銳雯)的陣營都是Noxus;
    def __init__(self,nickname,aggressivity=54,life_value=414): #英雄的初始攻擊力54;
        self.nickname=nickname  #為自己的銳雯起個別名;
        self.aggressivity=aggressivity #英雄都有自己的攻擊力;
        self.life_value=life_value #英雄都有自己的生命值;
    def attack(self,enemy):   #普通攻擊技能,enemy是敵人;
        enemy.life_value-=self.aggressivity #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值。 

實例出倆英雄

>>> g1=Garen(‘草叢倫‘)
>>> r1=Riven(‘銳雯雯‘)

交互:銳雯雯攻擊草叢倫,反之一樣

>>> g1.life_value
455
>>> r1.attack(g1)
>>> g1.life_value
401 

補充:

  garen_hero.Q()稱為向garen_hero這個對象發送了一條消息,讓他去執行Q這個功能,類似的有:

  garen_hero.W()

  garen_hero.E()

  garen_hero.R()

屬性查找;綁定到對象的方法的特殊之處;對象之間的交互