static 方法 (static method) 與類別方法 (class method) 都是透過類別 (class) 名稱呼叫,然而兩者不同的是 static 方法不帶預設參數 (parameter) ,這是說如果 static 方法要用到類別屬性 (class attribute) 的話,一樣要用類別名稱使用。
先來看到類別方法的簡單定義,這裡 Demo 類別的 demo() 方法準備當作類別方法,如果要讓 demo() 變成類別方法,就要用 demo 當內建函數 classmethod() 的參數,然後取得回傳值 (return value) 指派給 demo
class Demo:
i = 0
def demo(cls):
print(cls.i)
demo = classmethod(demo)
Demo.demo()
#《程式語言教學誌》的範例程式
# http://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()
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:static02.py
# 功能:示範定義類別
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 static02.py |
1 |
$ |
如果直接用裝飾子 (decorator) 加在類別方法的上一行,類別方法就不需要用 demo 當內建函數 classmethod() 參數的回傳值,定義上就更清楚了
class Demo3:
i = 2
@classmethod
def demo(cls):
print(cls.i)
Demo3.demo()
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:static03.py
# 功能:示範定義類別
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 static03.py |
2 |
$ |
同樣如果用裝飾子加在 static 方法的上一行,這也簡化 static 方法的定義
class Demo4:
i = 3
@staticmethod
def demo():
print(Demo4.i)
Demo4.demo()
#《程式語言教學誌》的範例程式
# http://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()
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:static05.py
# 功能:示範定義類別
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 static05.py |
4 |
5 |
$ |
相關教學影片