Python – Class 的 Static / Class / Abstract Method

Loading

測試環境為 CentOS 8 x86_64 (虛擬機)

參考文章 – https://www.maxlist.xyz/2019/12/08/python-class-static-abstract-method/

Class 不同的 Static / Class / Abstract Method 使用時機.

  • Static Method
    在 Class def 函式加上 @staticmethod 代表是 StaticMethods(不需要 self 參數) ,不需要產生 instance 後才能使用函式,可以直接呼叫 .

    範例:

    [root@localhost ~]# vi class_sample1.py
    class class_sample:
        def __init__(self):
            pass
    
        def method1(self):
            print('Method')
    
        @staticmethod
        def static_method1():
            print('Static Method')
    
    t1=class_sample()
    t1.method1()
    t1.static_method1()
    
    class_sample.static_method1()
    

    執行結果:

    [root@localhost ~]# python3 class_sample1.py
    Method
    Static Method
    Static Method
    

    說明:
    可以看到 範例 直接執行 class_sample.static_method1() 不需要產生 instance 來呼叫函數.

  • Class Method
    在 Class def 函式加上 @classmethod 代表是 ClassMethods(不需要 self 參數,須加上 class 本身參數,通常命名為 cls) ,跟 StaticMethods 一樣不需要產生 instance 後才能使用函式,可以直接呼叫,可以呼叫 Class 的其他函數 .

    範例:

    [root@localhost ~]# vi class_sample2.py
    class class_sample:
        def __init__(self):
            pass
    
        def method1(self):
            print('Method')
    
        @classmethod
        def class_method1(cls):
            print('Class Method')
            cls().method1()
    
    class_sample.class_method1()
    

    執行結果:

    [root@localhost ~]# python3 class_sample2.py
    Class Method
    Method
    

    說明:
    可以看到 範例 直接執行 class_sample.class_method1() 不需要產生 instance 來呼叫函數,並透過 class 本身參數 cls 去呼叫 class 的其他函數.

  • Abstract Method
    Python 需匯入 abc (Abstract Base Classes) 套件才能使用 抽象類別 (Abstract Method)

    abc (Abstract Base Classes) – This module provides the infrastructure for defining abstract base classes (ABCs) in Python.

    Abstract Method 無法直接使用,只能透過子類繼承,其主要是用來定義 子類繼承後 須要實現哪一些 Method.需在 Class def 函式加上 @abc.abstractmethod 代表是 abstractmethod .
    範例:

    [root@localhost ~]# vi class_sample3.py
    import abc
    
    class animal(abc.ABC):
        @abc.abstractmethod
        def name(self):
            return NotImplemented
    
    class dog(animal):
        def name(self,name):
            print(name)
    
    class cat(animal):
        def name(self,name):
            print(name)
    
    dog().name('Lucky')
    cat().name('Mimi')
    

    執行結果:

    [root@localhost ~]# python3 class_sample3.py
    Lucky
    Mimi
    

    說明:

    1. 先匯入 abc 套件後才能使用 abstractmethod
    2. class animal 定義了 name 這個 abstractmethod , 後面繼承的子類別需要實作出 name 這個函數.
    3. 繼承 animal 的 dog 與 cat 子類別都實體定義出 name 這個函數.
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料