Python中類靜態方法:@classmethod/@staticmethod詳解和實戰示例

在 Python 中,類方法 (@classmethod) 和靜態方法 (@staticmethod) 是類作用域下的兩種特殊方法。它們使用裝飾器定義,并且與實例方法 (def func(self)) 的行為有所不同。


1. 三種方法的對比概覽

方法類型是否訪問實例 (self)是否訪問類 (cls)典型用途
實例方法? 是? 否訪問對象屬性
類方法 @classmethod? 否? 是創建類的替代構造器,訪問類變量等
靜態方法 @staticmethod? 否? 否工具函數,與類邏輯相關但不依賴類或實例

2. 實例方法(默認方法)

class MyClass:def instance_method(self):print(f"This is an instance method. self = {self}")obj = MyClass()
obj.instance_method()  #  輸出 self 為該實例

3. 類方法 @classmethod

class MyClass:class_var = "Hello, Class!"@classmethoddef class_method(cls):print(f"This is a class method. cls = {cls}")print(f"Access class_var = {cls.class_var}")MyClass.class_method()  #  通過類調用
obj = MyClass()
obj.class_method()      #  通過實例也可以調用

🔹 特點:

  • 第一個參數是 cls,代表類本身

  • 常用于:

    • 構造不同初始化方式
    • 修改/訪問類變量
    • 工廠模式 (from_* 等)

示例:類方法作為工廠方法

class Book:def __init__(self, title, author):self.title = titleself.author = author@classmethoddef from_string(cls, book_str):title, author = book_str.split(",")return cls(title.strip(), author.strip())book = Book.from_string("1984, George Orwell")
print(book.title)  # ? 1984

4. 靜態方法 @staticmethod

class MyMath:@staticmethoddef add(x, y):return x + yprint(MyMath.add(3, 5))  # ? 8

特點:

  • 不接收 selfcls 參數

  • 和普通函數類似,但歸屬在類中,邏輯上與類相關

  • 常用于:

    • 與類操作相關的工具方法
    • 不需要訪問類或實例內部狀態

示例:靜態方法作為工具函數

class Temperature:def __init__(self, celsius):self.celsius = celsius@staticmethoddef to_fahrenheit(c):return c * 9 / 5 + 32def show(self):print(f"{self.celsius}°C = {self.to_fahrenheit(self.celsius)}°F")temp = Temperature(25)
temp.show()  # ? 25°C = 77.0°F

總結:何時用哪種方法?

場景推薦方法
需要訪問或修改實例屬性實例方法
需要訪問或修改類變量、類構造類方法 @classmethod
工具函數:與類相關但不訪問類或實例成員靜態方法 @staticmethod

@classmethod@staticmethod 應用場景實戰

利用 Python 中的 @classmethod@staticmethod 可以優雅地實現設計模式,如單例模式工廠模式。下面我將分別講解這兩種模式的原理、適用場景,并結合代碼示例說明如何使用類方法或靜態方法實現。


1、工廠模式(Factory Pattern)

定義:工廠模式是一種創建對象的設計模式,它允許類在創建對象時不暴露實例化邏輯,而是通過類方法返回不同的類實例。

使用類方法實現工廠模式

class Animal:def __init__(self, name):self.name = name@classmethoddef create_dog(cls):return cls("Dog")@classmethoddef create_cat(cls):return cls("Cat")# 使用工廠方法創建對象
dog = Animal.create_dog()
cat = Animal.create_cat()print(dog.name)  # ? Dog
print(cat.name)  # ? Cat

應用場景

  • 多種初始化方式(如從字符串、文件、數據庫等)
  • 根據條件返回不同子類對象

更復雜示例:帶注冊機制的工廠

class ShapeFactory:_creators = {}@classmethoddef register(cls, name, creator):cls._creators[name] = creator@classmethoddef create(cls, name, *args, **kwargs):if name not in cls._creators:raise ValueError(f"Unknown shape: {name}")return cls._creators[name](*args, **kwargs)# 各種 Shape 類
class Circle:def __init__(self, radius):self.radius = radiusclass Square:def __init__(self, length):self.length = length# 注冊
ShapeFactory.register("circle", Circle)
ShapeFactory.register("square", Square)# 創建對象
c = ShapeFactory.create("circle", 5)
s = ShapeFactory.create("square", 3)
print(c.radius)  # ? 5
print(s.length)  # ? 3

2、單例模式(Singleton Pattern)

定義:單例模式保證類在程序中只有一個實例。

使用類方法實現單例

class Singleton:_instance = None@classmethoddef get_instance(cls):if cls._instance is None:cls._instance = cls()return cls._instance# 測試
a = Singleton.get_instance()
b = Singleton.get_instance()
print(a is b)  # ? True

也可以結合 __new__ 實現單例

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instance# 所有實例是同一個
a = Singleton()
b = Singleton()
print(a is b)  # ? True

3、靜態方法在設計模式中的作用

工具類模式(Utility Pattern)

靜態方法常用于實現工具類(即所有方法都與對象狀態無關,僅執行邏輯計算)。

class MathUtils:@staticmethoddef add(x, y):return x + y@staticmethoddef multiply(x, y):return x * yprint(MathUtils.add(3, 4))       # ? 7
print(MathUtils.multiply(3, 4))  # ? 12

4、小結

設計模式推薦使用原因
工廠模式@classmethod需要訪問類構造器、支持多種創建方式
單例模式@classmethod / __new__控制實例生成的唯一性
工具類@staticmethod無需訪問類/實例,僅提供輔助功能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914171.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914171.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FastGPT革命:下一代語言模型的極速進化

本文深度解析FastGPT核心技術架構,涵蓋分布式推理、量化壓縮、硬件加速等前沿方案,包含完整落地實踐指南,助你掌握大模型高效部署的終極武器。引言:當大模型遭遇速度瓶頸2023年,ChatGPT引爆全球AI熱潮,但企…

Geant4 安裝---Ubuntu

安裝工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安裝Qt可視化工具(不需要可視化可以不安裝) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安裝Ope…

Spring Boot中請求參數讀取方式

目錄 一、前言 二、六種參數讀取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、對比和搭配 1.適用方法類型及建議使用場景 2.建議使用的請求路徑注解 3. 多種參數同時使用 4.同一請求不同方案&#xff1f…

2025華為OD機試真題最新題庫 (B+C+D+E+2025A+2025B卷) + 在線OJ在線刷題使用(C++、Java、Python C語言 JS合集)(正在更新2025B卷,目前已收錄710道)

2025年,已經開始使用AB卷題庫,題目和往期一樣,舊題加新題的組合,有題目第一時間更新,大家可以跟著繼續學習,目前使用復用題較多,可在OJ上直接找到對應的AB卷學習,可以放心學習&#…

分析新舊因子相關性

計算一組新因子、并分析它們與已有因子間的相關性1. 導入庫和初始化環境功能代碼解析數據加載2. 定義新因子計算函數功能代碼解析因子 1:波動率過濾器(filter_001_1)因子 2:ATR 過濾器(filter_001_2)因子 3…

Unity Demo——3D平臺跳躍游戲筆記

今天是一個3D平臺跳躍游戲的筆記。我們按照以下分類來對這個項目的代碼進行學習:核心游戲系統 (Core Game Systems)核心游戲系統是IkunOdyssey項目的基礎,負責所有游戲對象(如玩家、敵人、道具等)的通用行為和物理交互。它通過實體…

【C語言】回調函數、轉移表、qsort 使用與基于qsort改造冒泡排序

文章目錄數組指針/指針數組函數指針函數指針數組函數指針數組用途(轉移表)回調函數qsort函數基于qsort改造冒泡排序源碼數組指針/指針數組 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是數組指針變量int* arr2[5] { 0 }; //arr2是指針數組指針數組是存放指…

vue3 uniapp 使用ref更新值后子組件沒有更新 ref reactive的區別?使用from from -item執行表單驗證一直提示沒有值

遇到這樣一個問題,我有個1個頁面A,一個from表單組件,一個form-item組件, 使用是這樣的,我在父組件A中使用 ,執行表單驗證一直提示沒有值咱們先來講一講ref 和reactive的區別 ref 用來創建一個基本類型或單…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout(框布局) 采用QBoxLayout類可以在水平和垂直方向上排列控件,QHBoxLayout和 QVBoxLayout類繼承自QBoxLayout類。 QHBoxLayout(水平布局) 采用QHBoxLayout類,按照從左到右的順序來添加控件。QHBoxL…

Grok 4作戰圖刷爆全網,80%華人橫掃硅谷!清華上交校友領銜,95后站C位

來源 | 新智元短短兩年,馬斯克Grok 4的橫空出世,讓xAI團隊一舉站上AI之巔。昨日一小時發布會,Grok 4讓所有人大開眼界,直接刷爆了AIME 2025、人類最后的考試(HLE)兩大基準。這是狂堆20萬GPU才換來的驚人成果…

AI大模型(七)Langchain核心模塊與實戰(二)

Langchain核心模塊與實戰(二)Langchian向量數據庫檢索Langchian構建向量數據庫和檢索器批量搜索返回與之相似度最高的第一個檢索器和模型結合得到非籠統的答案LangChain構建代理通過代理去調用Langchain構建RAG的對話應用包含歷史記錄的對話生成Langchia…

Flutter基礎(前端教程①-容器和控件位置)

一個紅色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按鈕下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目錄 flex-box和flex-item 主軸和副軸 ?編輯 flex-box的屬性 flex-direction flex-wrap flex-flow justify-content ?編輯?align-items align-content flex-item的屬性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 當把一個塊級元素的displ…

【JMeter】執行系統命令

步驟如下: 添加JSP233 Sampler:右擊線程組>添加>取樣器>JSR223 Sampler2.填寫腳本,執行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent開發學習系列 - langchain之memory(1):內存中的短時記憶

內存中的短時記憶,在 LangChain 中通常指 ConversationBufferMemory 這類“對話緩沖記憶”工具。它的作用是:在內存中保存最近的對話歷史,讓大模型能理解上下文,實現連續對話。 對話緩沖記憶”工具 主要特點 只保留最近的對話內容…

uniapp實現微信小程序端圖片保存到相冊

效果圖展示 安裝插件海報畫板導入到項目里面&#xff0c;在頁面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相冊</button><image :src"path" mode"widthFix" v-if&qu…

Java生產帶文字、帶邊框的二維碼

Java 生成帶文字、帶邊框的二維碼1、Java 生成帶文字的二維碼1.1、導入jar包1.2、普通單一的二維碼1.2.1、代碼示例1.2.2、效果1.3、帶文字的二維碼1.&#xff13;.&#xff11;、代碼示例1.3.2、效果2、帶邊框的二維碼2.1、代碼示例2.2、帶邊框的二維碼效果 1、Java 生成帶文字…

ARM單片機啟動流程(三)(棧空間綜合理解及相關實際應用)

文章目錄1、引出棧空間問題2、解決問題2.1、RAM空間2.2、RAM空間具體分布2.3、關于棧空間的使用2.4、棧溢出2.5、變量的消亡2.6、回到關鍵字static2.7、合法性的判斷1、引出棧空間問題 從static關鍵字引出該部分內容。 為什么能從static引出來&#xff1f; 在使用該關鍵字的…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 鍵控LED實驗

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.實驗簡介 實驗目的&#xff1a; 從創建工程到編寫代碼&#xff0c;完成引腳約束&#xff0c;最后生成 bit 流下載到…

【Python練習】039. 編寫一個函數,反轉一個單鏈表

039. 編寫一個函數,反轉一個單鏈表 039. 編寫一個函數,反轉一個單鏈表方法 1:迭代實現運行結果代碼解釋方法 2:遞歸實現運行結果代碼解釋選擇方法迭代法與遞歸法的區別039. 編寫一個函數,反轉一個單鏈表 在 Python 中,可以通過迭代或遞歸的方式反轉一個單鏈表。 方法 1…