@classmethod

1. 基本概念

@classmethod 是 Python 中用于定義類方法的一種裝飾器。類方法與常規的實例方法不同,它的第一個參數是 cls,表示類本身,而不是實例。

class MyClass:class_attr = "Class Attribute"@classmethoddef class_method(cls):print(f"Accessing {cls.class_attr} via class method.")# 調用類方法(無需實例化)
MyClass.class_method()  # 輸出: Accessing Class Attribute via class method.

2. classmethod vs staticmethod vs 實例方法

classmethod vs staticmethod vs 實例方法

3. classmethod 的優點

3.1 封裝構造邏輯

將展開成對象的邏輯隔離在 class 內部,外部不需知道細節:

class Person:def __init__(self, name, age):self.name = nameself.age = age@classmethoddef from_string(cls, data_str):name, age = data_str.split(',')return cls(name, int(age))p = Person.from_string("Alice,30")
print(p.name, p.age)  # 輸出: Alice 30

3.2 類狀態管理

修改類屬性或跨實例共享狀態。

class MyClass:class_var = 0@classmethoddef my_class_method(cls, value):cls.class_var += value# 實例化前調用類方法
MyClass.my_class_method(10)a = MyClass()
b = MyClass()print(a.class_var)  # 10
print(b.class_var)  # 10# 修改類屬性
MyClass.my_class_method(5)print(a.class_var)  # 15
print(b.class_var)  # 15# 給 a 實例設置同名屬性
a.class_var = 100print(a.class_var)  # 100  -> 實例屬性覆蓋類屬性
print(b.class_var)  # 15   -> 還是引用類屬性
print(MyClass.class_var)  # 15

class_var 是類屬性,屬于類。
如果實例中沒有 class_var,訪問 obj.class_var 會去類中找。
一旦你給實例賦了 obj.class_var = 100,這個屬性就變成了實例屬性,不再和類屬性同步。

3.3 易于維護

如果構造函數變了參數,只需修改 classmethod,外部使用不用改。

3.4 多樣化構造方法

@classmethod
def from_dict(cls, d): ...@classmethod
def from_json(cls, j): ...

4. 子類是否需要重寫 classmethod

需要:子類構造參數與父類不同、子類邏輯與父類不同
可以不寫:父類方法已符合

5. classmethod + 多態封裝

通過 @classmethod 實現多態,不同子類可自定義類方法行為。
父類定義類方法接口,子類重寫實現多態。
調用時通過 cls 動態綁定到子類,避免硬編碼類名。

class Animal:@classmethoddef make_sound(cls):raise NotImplementedError("Subclasses must implement this!")class Dog(Animal):@classmethoddef make_sound(cls):return "Woof!"class Cat(Animal):@classmethoddef make_sound(cls):return "Meow!"def animal_sound(animal_cls):print(animal_cls.make_sound())animal_sound(Dog)  # 輸出: Woof!
animal_sound(Cat)  # 輸出: Meow!

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

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

相關文章

Qt 中使用 SQLite 數據庫

一、SQLite 數據庫介紹 SQLite 是一個輕量級的嵌入式關系型數據庫管理系統,它以庫的形式提供,不需要單獨的服務器進程,直接訪問存儲在普通磁盤文件中的數據庫。 主要特性 無服務器架構:SQLite 不需要單獨的服務器進程 零配置&a…

【Unity】IL2CPP相關理論知識學習

一種編譯技術。優點:性能優化:IL2CPP生成C代碼后由本地編譯器優化,一般在CPU性能和GC方面都優于Mono。特別在移動端或主機平臺,性能差距更加明顯。跨平臺支持:Unity作為跨平臺引擎,IL2CPP是支持iOS、Androi…

一個用于在 Ubuntu 22.04.3 LTS 上顯示文件系統超級塊信息的 C 程序

1.程序#include <stdio.h> #include <sys/statvfs.h> #include <errno.h>int main(int argc, char *argv[]) {const char *path;struct statvfs fs_info;// 檢查參數if (argc ! 2) {fprintf(stderr, "用法: %s <掛載點或路徑>\n", argv[0]);…

Git未檢測到文件更改

背景 在本地倉庫改動文件發現git檢測不到修改了的文件&#xff0c;安裝有Git狀態可視化工具&#xff0c;文件改動后應該是紅色標記&#xff0c;但是仍然是綠色的 git status&#xff0c;git diff等也都沒有顯示文件改動 原因 1.可能是文件命中了.gitignore文件過濾條件 檢查后發…

Golang學習之常見開發陷阱完全手冊

1. 指針的“溫柔陷阱”&#xff1a;空指針與野指針的致命一擊Go語言的指針雖然比C/C簡單&#xff0c;但照樣能讓你“痛不欲生”。新手常覺得Go的指針“安全”&#xff0c;但真相是&#xff1a;Go并不會幫你完全規避指針相關的Bug。空指針&#xff08;nil pointer&#xff09;和…

【python】sys.executable、sys.argv、Path(__file__) 在PyInstaller打包前后的區別

文章目錄sys.executable 的區別打包前打包后sys.argv 的區別打包前打包后Path(__file__) 的區別打包前打包后應用場景與解決方案總結在使用 PyInstaller 將 Python 腳本打包為獨立可執行文件時&#xff0c; sys.executable、 sys.argv 和 Path(__file__) 的行為會發生變化。理…

JWT基礎詳解

JSON Web Token 簡稱JWT 一、起源&#xff1a; 這一切的起源都源于網景公司的一個天才程序員&#xff0c;為了解決http協議無狀態問題&#xff0c;就讓瀏覽器承擔了一部分“記憶”責任&#xff08;每次客戶端&#xff0c;訪問服務器&#xff0c;自身就攜帶cookie&#xff0c;…

【Unity】MiniGame編輯器小游戲(十四)基礎支持模塊(游戲窗口、游戲對象、物理系統、動畫系統、射線檢測)

更新日期:2025年7月15日。 項目源碼:獲取項目源碼 索引 基礎支持模塊一、游戲窗口 MiniGameWindow1.窗體屬性2.快速退出鍵3.模擬幀間隔時間4.生命周期函數5.游戲狀態二、游戲對象 MiniGameObject1.位置2.激活狀態3.碰撞器4.限制游戲對象的位置5.生命周期函數6.移動三、物理系…

Swift6.0 - 5、基本運算符

目錄1、術語2、賦值運算符&#xff08;a b&#xff09;3、算術運算符&#xff08;、-、*、/&#xff09;3.1、余數運算符&#xff08;%&#xff09;3.2、一元負號運算符&#xff08;-a&#xff09;3.3、一元正號運算符&#xff08;a&#xff09;4、復合賦值運算符&#xff08;…

DataWhale AI夏令營 Task2.2筆記

本次代碼改進主要集中在聚類算法和主題詞提取方法的優化上&#xff0c;主要包含三個關鍵修改&#xff1a;首先&#xff0c;將聚類算法從KMeans替換為DBSCAN。這是因為原KMeans方法需要預先指定聚類數量&#xff0c;而實際評論數據中的主題分布難以預測。DBSCAN算法能夠自動確定…

自啟動策略調研

廣播攔截策略1.流程圖廣播發送├─ 特權進程&#xff08;Root/Shell&#xff09; → 放行├─ 系統進程&#xff08;UID≤1000&#xff09; → 自動啟動校驗 → 非法廣播&#xff1f; → 攔截│ ├─ 黑名單匹配 → 攔截│ └─ 用戶/白名單校驗 → 受限用戶&#xff1f; →…

MFC/C++語言怎么比較CString類型最后一個字符

文章目錄&#x1f527; 1. 直接下標訪問&#xff08;高效首選&#xff09;&#x1f50d; 2. ReverseFind 反向定位&#xff08;語義明確&#xff09;?? 3. Right 提取子串&#xff08;需臨時對象&#xff09;?? 4. 封裝工具函數&#xff08;推薦健壯性場景&#xff09;??…

【Cortex-M】異常中斷時的程序運行指針SP獲取,及SCB寄存器錯誤類型獲取

【Cortex-M】異常中斷時的程序運行指針SP獲取&#xff0c;及SCB寄存器錯誤類型獲取 更新以gitee為準&#xff1a; gitee 文章目錄異常中斷異常的程序運行指針SP獲取SCB寄存器錯誤類型獲取硬件錯誤異常 Hard fault status register (SCB->HFSR)存儲器管理錯誤異常 SCB->C…

項目流程管理系統使用建議:推薦13款

本文分享了13款主流的項目流程管理系統&#xff0c;包括&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.泛微 E-Office&#xff1b;4.Microsoft Project&#xff1b;5.簡道云&#xff1b;6.Zoho Projects&#xff1b;7.Tita 項目管理&#xff1b;8.Oracle Primave…

neovim的文件結構

在 Linux 系統中&#xff0c;Neovim 的配置文件主要存放在以下目錄結構中&#xff1a; &#x1f4c1; 核心配置目錄路徑內容描述~/.config/nvim/主配置目錄 (Neovim 的標準配置位置)~/.local/share/nvim/Neovim 運行時數據&#xff08;插件、會話等&#xff09; &#x1f5c2;?…

【網易云-header】

網易云靜態頁面&#xff08;1&#xff09;效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&…

Android開發知識點總結合集

初級安卓開發需要掌握的知識點主要包括安卓四大組件、Context、Intent、Handler、Fragment、HandlerThread、AsyncTask、IntentService、Binder、AIDL、SharedPreferences、Activity、Window、DecorView以及ViewRoot層級關系、觸摸事件分發機制、View繪制流程、自定義View。 1…

如何通過域名白名單?OVP防盜鏈加密視頻?

文章目錄前言一、什么是域名白名單?OVP防盜鏈二、域名白名單?OVP防盜鏈的實現原理三、如何實現域名白名單?OVP防盜鏈加密視頻總結前言 用戶原創視頻資源面臨被非法盜鏈、惡意嵌入的嚴峻挑戰&#xff0c;盜用行為不僅侵蝕創作者收益&#xff0c;更擾亂平臺生態秩序。域名白名…

密碼學系列文(2)--流密碼

一、流密碼的基本概念RC4&#xff08;Rivest Cipher 4&#xff09;是由密碼學家 Ron Rivest&#xff08;RSA 算法發明者之一&#xff09;于 1987 年設計的對稱流加密算法。它以簡單、高效著稱&#xff0c;曾廣泛應用于網絡安全協議&#xff08;如 SSL/TLS、WEP/WPA&#xff09;…

Drools?業務引擎

drools引擎使用 官網介紹 一、底層原理 ReteOO 網絡 ? 本質是一張“有向無環圖”&#xff0c;節點類型&#xff1a; – Root / ObjectTypeNode&#xff1a;按 Java 類型分發事實 – AlphaNode&#xff1a;單對象約束&#xff08;age > 18&#xff09; – BetaNode&#xf…