1. 程式人生 > >python-->類與物件

python-->類與物件

_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)