2018年1月20日 星期六

Python 3 的 class: instance method、class method、static method的區別

在Python 3當中,一個類別(class)的成員函式(member function/method),可以定義成instance method、class method、或是static method。instance method是物件層級的函式,而class method和static method是類別層級(無法存取物件層式的屬性)的函式(基本大觀念假設不細講)。以下大致比較一下這三者:
  • instance method
    • 物件層級
    • 定義前的修飾字:無
    • 定義語法: def method_name(self, ...): ... 
    • self 是該instance 的 reference
    • 呼叫方法: instance.method_name(...)
    • method當中使用物件/類別屬性的方式
      • self.AAA = 10 # 將物件層級屬性AAA設為 10
      • type(self).BBB = 20 # 將物件類別的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
  • class method 
    • 類別層級 (假設類別為 C)
    • 定義前的修飾字:@classmethod
    • 定義語法: def method_name(cls, ...): ...
    • cls 是該 class 的 reference
    • 呼叫方法:C.method_name(...)  或  instance_of_c.method_name(...)
    • method當中使用類別屬性的方式
      • cls.BBB = 20 # 將當下類別層級屬性BBB設為 20
      • C.BBB = 20 # 將C的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
  • static method
    • 類別層級 (假設類別為 C)
    • 定義前的修飾字:@staticmethod
    • 定義語法: def method_name(...): ...
    • 呼叫方法:C.method_name(...)  或  instance_of_c.method_name(...)
    • method當中使用類別屬性的方式
      • C.BBB = 20 # 將C的類別層級屬性BBB設為 20
      • ClassC.CCC = 30 # 將ClassC的類別層級屬性CCC設為30,ClassC未必是自己的類別
class method 和 static method 的觀念非常類似,主要差別只在於class method可以使用 cls.BBB的方式來使用自己的類別屬性。上例當中,使用 cls.BBB 和 C.BBB 看似一樣,實際上有一點小差別。當我們用 C1 繼承 C 的時候,cls.BBB 會是 C1 的類別屬性,但是 C.BBB 仍是 C的類別屬性,不會因為繼承而變成 C1 的屬性。最主要的差別就在這裡了。


沒有留言:

張貼留言