十二、python類和物件
一、概念
類calss:人以群分,物以類聚。種類/分類 具備相同特徵或者行為的一個群體,模型(造物件) 物件object:又被稱為例項 instance ,是一個群裡當中的成員/個體。模型造出來的具體的東西 二、類和物件在Python中表示 1)類的定義 class 類名: 類的組成部分class Man: pass class Man(): #()加不加都可以 pass class Man(object): pass # 以上三個表示相同的類
2)類的呼叫
class Man: pass new_man=Manprint(new_man) #結果:<class '__main__.Man'> print(Man) #結果:<class '__main__.Man'> '''物件的表示方法:類名()''' print(Man()) #結果:<__main__.Man object at 0x1016c84e0>
注意:例項化兩個物件,他們兩個不相等,記憶體地址不一樣
class Man: pass a=Man() b=Man() print(a) # <__main__.Man object at 0x00000212A43D9460>print(b) # <__main__.Man object at 0x00000212A43B76A0> print(a is b) # False
# 經典的面試題 print(Man() is Man()) # False # 如何進一步確定是不是同一個物件 print(id(a)) print(id(b))
三、類的命名
類的命名:大駝峰命名,兩個單詞的首字母大寫(首字母大寫)class PerfectManHelp
函式的命名:下劃線命名,兩個單詞之間用下劃線隔開 perfect_man_help
變數命名:下劃線命名,perfect_man_help
注意:一個物件可能屬於多個類
class Cat: pass jiafei = Cat() tom = Cat() blue = Cat()
print(jiafei) print(tom) print(blue) ''' <__main__.Cat object at 0x000002563CD49460> <__main__.Cat object at 0x000002563CD276A0> <__main__.Cat object at 0x000002563CD576D0> '''
四、屬性
什麼是屬性?表示類、物件的特徵。特徵是別人不具備的.
1)類屬性/例項屬性區別一:
類屬性:這個類的特徵,這個群體的版本特徵,別的類可能不具備,所有的成員都是一樣的
例項屬性:個體的特徵(不是每個成員都一樣),類當中的其他成員可能不具備
類屬性的獲取:類名.屬性 可以先天定義,也可以手工新增
class Man: # 定義類屬性 gender = '男' power = '強' print(Man.gender) # 男 Man類的gender屬性 print(Man.power) # 強 Man類的power屬性 # 手工新增 Man.hello = 'helle python' print(Man.hello) # helle python # 例項屬性的手工新增 Leilei = Man() Leilei.handsome = 'yes' print(Leilei.handsome) # yes ShiTou = Man() print(ShiTou.handsome) # ShiTou沒有定義handsome,這是錯誤的
2)類屬性/例項屬性區別二
類屬性,可以被例項、物件訪問
示例屬性,不可以被類獲取
類可以訪問例項屬性嗎?Man.name 不可以
例項可以訪問類屬性嗎?可以
class Man: #定義類屬性 power = 'strong' gender = '男' Lei= Man() Lei.eye = 'big' #eye是Lei這個例項的屬性 print(polo.eye) print(Man.eye)#類不能獲取例項屬性
2)初始化
要通過定義的類得到一個具體的物件。生出一個物件
物件個體,初始化過程保證生出來是不一樣的
_ _init_ _(self) :在這裡設定先天的屬性
注意:self: 在類裡面,表示一個物件它自己
先天設定的例項屬性:self.屬性 = 引數
語法:def_ _init_ _ (self,name):
self.name = name
class Man: #定義類屬性 power = 'strong' gender = '男' def __init__(self,face_shape,name): #物件的例項化過程 #定義在類裡面,定義例項屬性用self.屬性 = 引數 self.face = face_shape self.name = name Lei= Man('圓臉','polo') print(Lei.face,Lei.name)
先天設定好例項屬性,可以後天修改
class Man: #定義類屬性 power = 'strong' gender = '男' def __init__(self,name,face_shape = '圓臉'): #預設引數要放在位置引數的後面 #物件的例項化過 #定義在類裡面,定義例項屬性用self.屬性 = 引數 self.face = face_shape self.name = name Lei= Man('Lei','方臉') print(Lei.face) Lei.face = '瓜子臉' print(polo.face) ''' 方臉 瓜子臉 '''
__init__ (self) 總結:
必須return None(不寫就是return None,寫一個return,也會返回None。return 其他值會報錯)
傳入的引數必須設定為例項屬性,才能被物件訪問到
例項方法中的self呼叫__init__ 的例項屬性
class Man: #定義類屬性 power = 'strong' gender = '男' def __init__(self,name,face_shape ): self.face = face_shape self.name = name def drink(self,brand): print('{}正在喝{}酒'.format(self.name,brand))#如果沒有self,就沒法呼叫name polo = Man('polo','方臉') print(polo.drink('茅臺')) ''' polo正在喝茅臺酒 None '''
一個例項方法可以呼叫別的例項方法,也可以呼叫類方法
class Man: #定義類屬性 power = 'strong' gender = '男' @classmethod def eat(cls): print('在吃東西') def __init__(self,name,face_shape ): self.face = face_shape self.name = name def drink(self,brand): print('{}正在喝{}酒'.format(self.name,brand))#如果沒有self,就沒法呼叫name self.play_game() #play_game()在後面也會正常呼叫到 self.eat()#例項方法可以呼叫類方法 def play_game(self): print('在玩遊戲') polo = Man('polo','方臉') print(polo.drink('茅臺')) ''' polo正在喝茅臺酒 在玩遊戲 在吃東西 None '''
五、方法
方法:表示類、物件的行為,本質上是函式
屬性名稱:名詞
方法:動詞
方法 VS 函式:
1.方法裡有self
2.方法放在類裡面,縮排的
3.呼叫過程不一樣,方法需要加字首,類名或者物件名,函式要麼不加,要麼加模組名
class Man: # 定義類屬性 gender = '男' power = '強' def drink(self): '''喝飲料''' pass def play_game(self): '''玩遊戲''' pass # 物件.方法() Man().drink() Lei= Man() Lei.drink() # 行為是屬於某一個人的,不能被類呼叫 # 不OK,Man.drink()
例項方法,物件方法:
1.第一個引數名稱必須是self,
2.例項方法在呼叫時字首是物件,不能是類(如物件Man( ),類是Man)
類方法:
1.在方法的上面新增裝飾器@classmethod
2.把例項方法中的self改成cls
class Man: #定義類屬性 power = 'strong' gender = '男' @classmethod #@表示裝飾器 decorator def eatfood(cls): #cls就是class的縮寫 print('在吃東西') print(Man.eatfood()) ''' 在吃東西 None # 類方法沒有return,返回值是none,print會列印方法的返回值 '''靜態方法: 表示:在方法上面新增@staticmethod 不需要用self、cls作為固定引數,可以傳參 是剛剛好放在一個類當中的普通函式而已,除了放在類中,和普通函式沒什麼區別 沒有實際作用,和類或物件沒有關係 為什麼要用靜態方法?為什麼要把普通的函式放在類當中去?----》方便管理 靜態方法呼叫:在靜態方法前加類或物件名
class Man: #定義類屬性 power = 'strong' gender = '男' @staticmethod def hello(): #沒有固定引數self print('在學習python') print(Man.hello()) print(Man().hello()) ''' 在學習python None 在學習python None '''
六、總結
1、例項屬性和類屬性的區別;
例項可以獲取例項屬性和類屬性
類只能獲取類屬性
例項屬性寫到__init__裡面
2、方法
例項方法:例項具備的,類不一定具備。類不能呼叫例項方法
類方法"類具備的,例項可以獲取
靜態方法:放在類裡面的函式
3、__init__
表示物件的初始化過程,通常在裡面定義例項屬性
實力屬性的值通過引數傳遞進來
引數必須賦值給例項屬性,self.屬性 = 引數
4、self/cls
self:在類裡面,表示一個物件他自己,自我 (有的語言使用this) cls:在類裡面,表示一個類他自己