1. 程式人生 > >python:類方法和靜態方法

python:類方法和靜態方法

1.類方法:

  • 類屬性就是針對類物件定義的屬性

                   使用賦值語句在class關鍵字下方可以定義類屬性

                   類屬性用於記錄與這個類相關的特徵

  •      類方法就是針對類物件定義的方法

            在類方法內部可以直接訪問類屬性或者呼叫其他的類方法

  類方法的定義:

@classmethod
def 類方法名(cls):
    pass
  • 類方法需要修飾器@classmethod來標識,告訴直譯器這是一個類方法
  • 類方法的第一個引數應該是cls
  1. 由那個類呼叫的方法,方法內的cls就是哪一個類的引用
  2. 這個引數和例項方法的第一個引數self類似
  • 通過  類名.呼叫類方法,呼叫方法時,不需要傳遞cls引數
  • 在方法內部:

              可以通過cls. 訪問類的屬性、呼叫其他的方法

class Tool:
    count=0#類屬性
    
    @classmethod    
    def show_tool_count(cls):#類方法
        print("工具物件的數量%d"% cls.count)
        
    def __init__(self,name):
        self.name=name
        Tool.count+=1    

a=Tool("榔頭")
b=Tool("鐵揪")
Tool.show_tool_count()#在類的外部呼叫類方法使用類名.類方法
print(Tool.count)#在類外部訪問類屬性同上

2.靜態方法

在開發中,如果需要在類中封裝一個方法,這個方法:

        既不需要訪問例項屬性或者呼叫例項方法,也不需要訪問類屬性或者呼叫類方法

這個時候,可以把這個方法封裝成一個靜態方法

定義靜態方法:

@staticmethod
def 靜態方法名():
    pass

靜態方法需要用 @staticmethod 來標識,告訴直譯器這是一個靜態方法

通過   類名.呼叫靜態方法

class Dog:
    
    @staticmethod
    def run():
        #不需要訪問例項屬性也不需要訪問例項方法
        print("跑")
        

#通過類名.呼叫靜態方法,不需要建立物件

Dog.run()

案例:

class Game:
    #歷史最高分(類屬性)
    top_score=0
    def __init__(self,player_game):
        self.player_name=player_game
    @staticmethod
    def show_help():
        print("幫助資訊:按start開始遊戲")
        
    @classmethod
    def show_top_score(cls):
        print("歷史最高分 %d"% cls.top_score)
        
    def start_game(self):
        print("%s開始遊戲 "%self.player_name)

#1.檢視遊戲的幫助資訊
Game.show_help()
#2.檢視歷史最高分
Game.show_top_score()
#3.建立遊戲
xiaoming=Game("小明")
xiaoming.start_game()

如何確定方法的屬性?

1.例項方法---方法內部需要訪問例項屬性

      例項方法內部可以使用  類名.訪問類屬性

2.類方法---方法內部只需要訪問類屬性

3.靜態方法---方法內部不需要訪問例項屬性和類屬性

如果方法內部需要訪問 例項屬性,有需要訪問類屬性,應該定義例項方法,因為類只有一個,在例項方法內部可以使用類名.訪問類屬性