測試環境為 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
說明:
- 先匯入 abc 套件後才能使用 abstractmethod
- class animal 定義了 name 這個 abstractmethod , 後面繼承的子類別需要實作出 name 這個函數.
- 繼承 animal 的 dog 與 cat 子類別都實體定義出 name 這個函數.
沒有解決問題,試試搜尋本站其他內容