python-->類與物件
阿新 • • 發佈:2019-01-14
_init_方法詳解
#方式一:為物件初始化自己獨有的特徵 class People: country='China' x=1 def run(self): print('----->', self) # 例項化出三個空物件 objone=People() objtwo=People() objthree=People() # 為物件定製自己獨有的特徵 objone.name='tom' objone.age=18 objone.sex='male' objtwo.name='jack' objtwo.age=22 objtwo.sex='female' objthree.name='rusa' objthree.age=26 objthree.sex='female' print(objone.__dict__) print(objtwo.__dict__) print(objthree.__dict__) print(People.__dict__) #方式二、為物件初始化自己獨有的特徵 class People: country='China' x=1 def run(self): print('----->', self) # 例項化出三個空物件 objone=People() objtwo=People() objthree=People() # 為物件定製自己獨有的特徵 def fuzhi(obj, x, y, z): obj.name = x obj.age = y obj.sex = z fuzhi(objone,'tom',18,'male') fuzhi(objtwo,'jack',22,'female') fuzhi(objthree,'rusa',26,'female') #方式三、為物件初始化自己獨有的特徵 class People: country='China' x=1 def fuzhi(obj, x, y, z): obj.name= x obj.age = y obj.sex = z def run(self): print('----->', self) objone=People() People.fuzhi(objone,'tom',18,'male') objtwo=People() People.fuzhi(objtwo,'jack',22,'female') objthree=People() People.fuzhi(objthree,'rusa',26,'female') # 方式四、為物件初始化自己獨有的特徵 class People: country='China' x=1 def __init__(obj, x, y, z): obj.name = x obj.age = y obj.sex = z def run(self): print('----->', self) objone=People('egon',18,'male') #People.__init__(objone,'tom',18,'male') objtwo=People('lxx',38,'female') #People.__init__(objtwo,'jack',22,'female') objthree=People('alex',38,'female') #People.__init__(objthree,'rusa',26,'femal
ps:__init__方法內可以有任意的python程式碼,但是一定不能有返回值。
類的特殊屬性
- 類名.__name__# 類的名字(字串)
- 類名.__doc__# 類的文件字串
- 類名.__base__# 類的第一個父類(在講繼承時會講)
- 類名.__bases__# 類所有父類構成的元組(在講繼承時會講)
- 類名.__dict__# 類的字典屬性
- 類名.__module__# 類定義所在的模組
- 類名.__class__# 例項對應的類(僅新式類中)
屬性查詢
類有兩種屬性:資料屬性和函式屬性
- 類的資料屬性是所有物件共享的
- 類的函式屬性是繫結給物件用的
#類的資料屬性是所有物件共享的,id一樣 print(id(Colleges.school)) print(id(s1.school)) print(id(s2.school)) print(id(s3.school)) ''' 4377347328 4377347328 4377347328 4377347328 ''' #類的函式屬性是繫結給物件使用的,obj.method稱為繫結方法,記憶體地址都不一樣 print(Colleges.learn) print(s1.learn) print(s2.learn) print(s3.learn) ''' <function Colleges.learn at 0x1021329d8> <bound method Colleges.learn of <__main__.Colleges object at 0x1021466d8>> <bound method Colleges.learn of <__main__.Colleges object at 0x102146710>> <bound method Colleges.learn of <__main__.Colleges object at 0x102146748>>
obj.name會先從obj自己的名稱空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到則丟擲異常
繫結到物件的方法特殊之處
- 類中定義的函式(沒有被任何裝飾器裝飾的)是類的函式屬性,類可以使用,但必須遵循函式的引數規則,有幾個引數需要傳幾個引數
- 類中定義的函式(沒有被任何裝飾器裝飾的)是給物件使用的,而且是繫結到物件的,雖然所有物件指向的都是相同的功能,但是繫結到不同的物件就是不同的繫結方法
- 繫結到物件的方法的特殊之處在於,繫結給誰就由誰來呼叫,誰來呼叫,就會將‘誰’本身當做第一個引數傳給方法,即自動傳值(方法__init__也是一樣的道理)
ps:繫結到物件的方法的這種自動傳值的特徵,決定了在類中定義的函式都要預設寫一個引數self,self可以是任意名字,但是約定俗成地寫出self
物件互動
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 #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值 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 #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值 例項化物件 g=Garen('草叢倫') r=Riven('銳雯雯') 物件互動 r.attack(g)