Python 速查手冊

6.5 static 方法與類別方法

static 方法 (static method) 與類別方法 (class method) 都是透過類別 (class) 名稱呼叫,然而兩者不同的是 static 方法不帶預設參數 (parameter) ,這是說如果 static 方法要用到類別屬性 (class attribute) 的話,一樣要用類別名稱使用。

static 在 C-Style 的程式語言中多半是關鍵字 (keyword) ,這些程式語言裡 static 的用途也不完全一樣,至於 Python 的類別方法及 static 方法都是用內建函數 (built-in function) 來處理,而 static 並不是 Python 的關鍵字,特此說明。

先來看到類別方法的簡單定義,這裡 Demo 類別的 demo() 方法準備當作類別方法,如果要讓 demo() 變成類別方法,就要用 demo 當內建函數 classmethod() 的參數,然後取得回傳值 (return value) 指派給 demo

class Demo:
    i = 0
    
    def demo(cls):
        print(cls.i)
    demo = classmethod(demo)
    
Demo.demo()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:static01.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 static01.py
0
$

static 方法的定義也一樣,要換成用內建函數 staticmethod() ,留意 static 方法沒有預設參數

class Demo2:
    i = 1
    
    def demo():
        print(Demo2.i)
    demo = staticmethod(demo)
    
Demo2.demo()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:static02.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 static02.py
1
$

如果直接用裝飾子 (decorator) 加在類別方法的上一行,類別方法就不需要用 demo 當內建函數 classmethod() 參數的回傳值,定義上就更清楚了

class Demo3:
    i = 2
    
    @classmethod
    def demo(cls):
        print(cls.i)
    
Demo3.demo()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:static03.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 static03.py
2
$

同樣如果用裝飾子加在 static 方法的上一行,這也簡化 static 方法的定義

class Demo4:
    i = 3
    
    @staticmethod
    def demo():
        print(Demo4.i)    

Demo4.demo()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:static04.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 static04.py
3
$

注意 static 方法就像是透過類別名稱呼叫的函數 (function) ,因此在 static 方法中使用類別屬性要用類別名稱,使用實體屬性也要建立物件 (object) 實體 (instance) ,如此例 Demo5 類別的 static 方法 demo 印出類別屬性 i 及實體屬性 j 的值,類別屬性 i 是直接用類別名稱 Demo5 取得,實體屬性 j 則是用 Demo5 後面加上小括弧,也就是 Demo5 的建構子回傳的實體物件,再加上小數點取得實體屬性 j

class Demo5:
    i = 4
    
    def __init__(self):
        self.j = 5
    
    @staticmethod
    def demo():
        print(Demo5.i)
        print(Demo5().j)

Demo5.demo()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:static05.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 static05.py
4
5
$

上一頁: 6.4 類別屬性與實體屬性
Python 速查手冊 - 目錄
下一頁: 6.6 封裝
回 Python 教材首頁