Python 類屬性和類方法

僅用學(xué)習(xí)參考

目標(biāo)

  • 類的結(jié)構(gòu)
  • 類屬性和實例屬性
  • 類方法和靜態(tài)方法

01. 類的結(jié)構(gòu)

1.1 術(shù)語 —— 實例

  1. 使用面向?qū)ο箝_發(fā)书幕,第 1 步 是設(shè)計

  2. 使用 類名() 創(chuàng)建對象晦溪,創(chuàng)建對象 的動作有兩步:

      1. 在內(nèi)存中為對象 分配空間
      1. 調(diào)用初始化方法 __init__對象初始化
  3. 對象創(chuàng)建后,內(nèi)存 中就有了一個對象的 實實在在 的存在 —— 實例

因此魔熏,通常也會把:

  1. 創(chuàng)建出來的 對象 叫做 實例
  2. 創(chuàng)建對象的 動作 叫做 實例化
  3. 對象的屬性 叫做 實例屬性
  4. 對象調(diào)用的方法 叫做 實例方法

在程序執(zhí)行時:

  1. 對象各自擁有自己的 實例屬性

  2. 調(diào)用對象方法衷咽,可以通過 self.

    • 訪問自己的屬性

    • 調(diào)用自己的方法

結(jié)論

  • 每一個對象 都有自己 獨立的內(nèi)存空間保存各自不同的屬性

  • 多個對象的方法蒜绽,在內(nèi)存中只有一份镶骗,在調(diào)用方法時,需要把對象的引用 傳遞到方法內(nèi)部

1.2 類是一個特殊的對象

Python一切皆對象

  • class AAA: 定義的類屬于 類對象
  • obj1 = AAA() 屬于 實例對象
  • 在程序運行時躲雅, 同樣 會被加載到內(nèi)存

  • Python 中鼎姊, 是一個特殊的對象 —— 類對象

  • 在程序運行時,類對象 在內(nèi)存中 只有一份相赁,使用 一個類 可以創(chuàng)建出 很多個對象實例

  • 除了封裝 實例屬性方法外此蜈,類對象 還可以擁有自己的 屬性方法

    1. 類屬性

    2. 類方法

  • 通過 類名. 的方式可以 訪問類的屬性 或者 調(diào)用類的方法

02. 類屬性和實例屬性

2.1 概念和使用

  • 類屬性 就是給 類對象 中定義的 屬性
  • 通常用來記錄 與這個類相關(guān) 的特征
  • 類屬性 不會用于記錄 具體對象的特征

示例需求

  • 定義一個 工具類
  • 每件工具都有自己的 name
  • 需求 —— 知道使用這個類,創(chuàng)建了多少個工具對象噪生?
class Tool(object):

    # 使用賦值語句裆赵,定義類屬性,記錄創(chuàng)建工具對象的總數(shù)
    count = 0

    def __init__(self, name):
        self.name = name

        # 針對類屬性做一個計數(shù)+1
        Tool.count += 1


# 創(chuàng)建工具對象
tool1 = Tool("斧頭")
tool2 = Tool("榔頭")
tool3 = Tool("鐵鍬")

# 知道使用 Tool 類到底創(chuàng)建了多少個對象?
print("現(xiàn)在創(chuàng)建了 %d 個工具" % Tool.count)

2.2 屬性的獲取機制

Python屬性的獲取 存在一個 向上查找機制

  • 因此跺嗽,要訪問類屬性有兩種方式:
  1. 類名.類屬性

  2. 對象.類屬性 (不推薦)

注意

  • 如果使用 對象.類屬性 = 值 賦值語句战授,只會 給對象添加一個屬性,而不會影響到 類屬性的值

03. 類方法和靜態(tài)方法

3.1 類方法

  • 類屬性 就是針對 類對象 定義的屬性

    • 使用 賦值語句class 關(guān)鍵字下方可以定義 類屬性

    • 類屬性 用于記錄 與這個類相關(guān) 的特征

  • 類方法 就是針對 類對象 定義的方法

    • 類方法 內(nèi)部可以直接訪問 類屬性 或者調(diào)用其他的 類方法

語法如下

@classmethod
def 類方法名(cls):
    pass
  • 類方法需要用 修飾器 @classmethod 來標(biāo)識桨嫁,告訴解釋器這是一個類方法

  • 類方法的 第一個參數(shù) 應(yīng)該是 cls

    • 哪一個類 調(diào)用的方法植兰,方法內(nèi)的 cls 就是 哪一個類的引用

    • 這個參數(shù)和 實例方法 的第一個參數(shù)是 self 類似

    • 提示 使用其他名稱也可以,不過習(xí)慣使用 cls

  • 通過 類名. 調(diào)用 類方法璃吧,調(diào)用方法時楣导,不需要傳遞 cls 參數(shù)

在方法內(nèi)部

  • 可以通過 cls. 訪問類的屬性

  • 也可以通過 cls. 調(diào)用其他的類方法

示例需求

  • 定義一個 工具類

  • 每件工具都有自己的 name

需求 —— 在 封裝一個 show_tool_count 的類方法,輸出使用當(dāng)前這個類畜挨,創(chuàng)建的對象個數(shù)

@classmethod
def show_tool_count(cls):
    """顯示工具對象的總數(shù)"""
    print("工具對象的總數(shù) %d" % cls.count)

在類方法內(nèi)部筒繁,可以直接使用 cls 訪問 類屬性 或者 調(diào)用類方法

3.2 靜態(tài)方法

  • 在開發(fā)時,如果需要在 中封裝一個方法巴元,這個方法:

    • 不需要 訪問 實例屬性 或者調(diào)用 實例方法

    • 不需要 訪問 類屬性 或者調(diào)用 類方法

  • 這個時候毡咏,可以把這個方法封裝成一個 靜態(tài)方法

語法如下

@staticmethod
def 靜態(tài)方法名():
    pass
  • 靜態(tài)方法 需要用 修飾器 @staticmethod 來標(biāo)識,告訴解釋器這是一個靜態(tài)方法

  • 通過 類名. 調(diào)用 靜態(tài)方法

class Dog(object):
    
    # 狗對象計數(shù)
    dog_count = 0
    
    @staticmethod
    def run():
        
        # 不需要訪問實例屬性也不需要訪問類屬性的方法
        print("狗在跑...")

    def __init__(self, name):
        self.name = name

執(zhí)行如下:

In [2]: class Dog(object):
   ...:     dog_count = 0
   ...:     @staticmethod
   ...:     def run():
   ...:         print("狗在跑")
   ...:     def __init__(self,name):
   ...:         self.name = name
   ...: 

In [4]: dog1 = Dog("小白")

In [6]: dog1.run()
狗在跑

In [7]: 
  • 3.3 方法綜合案例

    需求

  1. 設(shè)計一個 Game

  2. 屬性:

    • 定義一個 類屬性 top_score 記錄游戲的 歷史最高分

    • 定義一個 實例屬性 player_name 記錄 當(dāng)前游戲的玩家姓名

  3. 方法:

    • 靜態(tài)方法 show_help 顯示游戲幫助信息

    • 類方法 show_top_score 顯示歷史最高分

    • 實例方法 start_game 開始當(dāng)前玩家的游戲

  4. 主程序步驟

      1. 查看幫助信息
      1. 查看歷史最高分
      1. 創(chuàng)建游戲?qū)ο蟠伲_始游戲

案例小結(jié)

  1. 實例方法 —— 方法內(nèi)部需要訪問 實例屬性

    • 實例方法 內(nèi)部可以使用 類名. 訪問類屬性
  2. 類方法 —— 方法內(nèi)部 需要訪問 類屬性

  3. 靜態(tài)方法 —— 方法內(nèi)部呕缭,不需要訪問 實例屬性類屬性

    提問

    如果方法內(nèi)部 即需要訪問 實例屬性,又需要訪問 類屬性修己,應(yīng)該定義成什么方法恢总?

    答案

  • 應(yīng)該定義 實例方法

  • 因為,類只有一個睬愤,在 實例方法 內(nèi)部可以使用 類名. 訪問類屬性

class Game(object):

    # 游戲最高分片仿,類屬性
    top_score = 0

    @staticmethod
    def show_help():
        print("幫助信息:讓僵尸走進(jìn)房間")
        
    @classmethod
    def show_top_score(cls):
        print("游戲最高分是 %d" % cls.top_score)

    def __init__(self, player_name):
        self.player_name = player_name

    def start_game(self):
        print("[%s] 開始游戲..." % self.player_name)
        
        # 使用類名.修改歷史最高分
        Game.top_score = 999

# 1. 查看游戲幫助
Game.show_help()

# 2. 查看游戲最高分
Game.show_top_score()

# 3. 創(chuàng)建游戲?qū)ο螅_始游戲
game = Game("小明")

game.start_game()

# 4. 游戲結(jié)束戴涝,查看游戲最高分
Game.show_top_score()

關(guān)注微信公眾號滋戳,回復(fù)【資料】钻蔑、Python、PHP奸鸯、JAVA咪笑、web,則可獲得Python娄涩、PHP窗怒、JAVA、前端等視頻資料蓄拣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扬虚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子球恤,更是在濱河造成了極大的恐慌辜昵,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽斧,死亡現(xiàn)場離奇詭異堪置,居然都是意外死亡,警方通過查閱死者的電腦和手機张惹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門舀锨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宛逗,你說我怎么就攤上這事坎匿。” “怎么了雷激?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵替蔬,是天一觀的道長。 經(jīng)常有香客問我侥锦,道長进栽,這世上最難降的妖魔是什么德挣? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任恭垦,我火速辦了婚禮,結(jié)果婚禮上格嗅,老公的妹妹穿的比我還像新娘番挺。我一直安慰自己,他們只是感情好屯掖,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布玄柏。 她就那樣靜靜地躺著,像睡著了一般贴铜。 火紅的嫁衣襯著肌膚如雪粪摘。 梳的紋絲不亂的頭發(fā)上瀑晒,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音徘意,去河邊找鬼苔悦。 笑死,一個胖子當(dāng)著我的面吹牛椎咧,可吹牛的內(nèi)容都是我干的玖详。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼勤讽,長吁一口氣:“原來是場噩夢啊……” “哼蟋座!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脚牍,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤向臀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诸狭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飒硅,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年作谚,在試婚紗的時候發(fā)現(xiàn)自己被綠了三娩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妹懒,死狀恐怖雀监,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眨唬,我是刑警寧澤会前,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站匾竿,受9級特大地震影響瓦宜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岭妖,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一临庇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昵慌,春花似錦假夺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淳蔼,卻和暖如春侧蘸,著一層夾襖步出監(jiān)牢的瞬間裁眯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工讳癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留未状,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓析桥,卻偏偏與公主長得像司草,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泡仗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 類屬性和類方法 目標(biāo) 類的結(jié)構(gòu) 類屬性和實例屬性 類方法和靜態(tài)方法 01. 類的結(jié)構(gòu) 1.1 術(shù)語 —— 實例 使...
    ottox閱讀 620評論 0 1
  • 目標(biāo) 類的結(jié)構(gòu) 類屬性和實例屬性 類方法和靜態(tài)方法 01. 類的結(jié)構(gòu) 1.1 術(shù)語 —— 實例 使用面相對象開發(fā)埋虹,...
    程序員同行者閱讀 891評論 0 1
  • 一截亦、總體目錄 1.1爬泥、類的結(jié)構(gòu) 1.2、類屬性和實例屬性 1.3崩瓤、類方法和靜態(tài)方法 二袍啡、類的結(jié)構(gòu) 2.1、術(shù)語 -...
    IIronMan閱讀 663評論 0 1
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,915評論 6 13
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,090評論 1 32