屬性查找;綁定到對象的方法的特殊之處;對象之間的交互
阿新 • • 發佈:2019-01-10
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()
屬性查找;綁定到對象的方法的特殊之處;對象之間的交互