074、Python 關于實例方法、靜態方法和類方法

在Python中,類可以定義三種類型的方法:實例方法、靜態方法和類方法。每種方法都有其特定的用途和調用方式。

實例方法(Instance Methods)

  • 定義:實例方法是綁定到類實例上的方法。它們必須有一個名為self的隱式第一個參數,這個參數引用調用該方法的實例。如:

    class MyClass:  def instance_method(self, x):  print(f"Instance method called with {x} and {self}")
    
  • 調用:通過實例來調用實例方法。

  • 訪問:實例方法可以訪問和修改實例變量,也可以訪問類變量(非私有的)。

  • 繼承:實例方法可以被繼承并在子類中覆蓋。子類可以訪問和調用父類中的實例方法,也可以定義與父類同名的方法來覆蓋父類方法。

  • 用途:實例方法通常用于實現與對象狀態相關的行為。

總結:實例方法基本都是面向對象的,即目的就是發送消息給對象。它只能修改實例變量,必須通過對象調用。如下示例就很好體現了它的特征:

class Person:  def __init__(self, name, age):  # 實例變量定義在 __init__ 方法中  self.name = name  self.age = age  # 這是一個實例方法,可以修改實例變量 age  def grow_older(self, years):  self.age += years  print(f"{self.name} is now {self.age} years old.")  # 創建一個 Person 類的實例  
p = Person("Alice", 25)  # 由實例調用實例方法 grow_older ,然后修改實例變量 age  
p.grow_older(3)  # Alice 現在 28 歲了  # 再次打印實例變量 age 的值  
print(p.age)  # 輸出: 28

靜態方法(Static Methods)

  • 定義:靜態方法是與類相關的函數,但它們并不與類或實例狀態關聯。定義一個靜態方法需要用到 @staticmethod 裝飾器。
  • 調用:可以通過類名或實例名來調用靜態方法。它們沒有隱式的第一個參數(如selfcls)。
  • 訪問:靜態方法不能直接訪問實例變量(除非它們作為參數傳遞),但可以訪問類變量(非私有的)。
  • 用途:靜態方法通常用于封裝與類相關的功能,但這些功能不依賴于類或實例的狀態。

總結:定義需使用 @staticmethod 裝飾器,沒有隱式參數,可通過對象或類調用,適用于無關類或示例狀態的方法。如下示例:

class MyClass:  # 使用@staticmethod裝飾器定義一個靜態方法,它不需要訪問實例變量或類變量  @staticmethod  def static_method(arg1, arg2):  # 在這里,可以進行不需要實例或類狀態的操作  result = arg1 + arg2  print(f"The result of the operation is: {result}")  # 創建對象
obj = MyClass()# 調用靜態方法  
MyClass.static_method(5, 3)  # 不需要創建類的實例調用 
obj.static_method(5, 3)  # 也可以通過實例調用靜態方法# 輸出: The result of the operation is: 8

類方法(Class Methods)

  • 定義:類方法是綁定到類而不是實例上的方法。需要用到 @classmethod 裝飾器。
  • 調用:通過類名或實例對象來調用類方法。無論是通過類名還是實例對象調用類方法,Python都會自動將類本身作為cls參數傳入。
  • 訪問:類方法無法直接訪問實例對象的屬性,但可以訪問和修改類變量。
  • 可見性和繼承:類方法可以被繼承并在子類中覆蓋。但是,子類無法直接訪問父類中的類方法(除非使用super()函數或類名來調用)。
  • 用途:類方法通常用于創建類的實例(工廠方法)、修改類狀態或執行與類本身相關的操作,而不是與特定實例相關的操作。

總結:定義需使用 @classmethod 裝飾器,需要cls隱式參數,可通過對象或類調用,適用于執行與類本身相關的操作。如下示例:

class MyClass:  # 定義一個類變量,屬于類本身,所有的實例共享這個變量  class_variable = "I'm a class variable"  # 定義一個類方法,它使用 @classmethod 裝飾器  @classmethod  def class_method(cls, arg):  # 類方法的第一個參數是 cls,它引用類本身  print(f"This is a class method of {cls.__name__}")  # 可以通過 cls 訪問類變量  print(f"Class variable: {cls.class_variable}")  # 可以在這里執行與類本身相關的操作  print(f"Argument passed to class method: {arg}")  # 創建對象
obj = MyClass()# 調用類方法  
MyClass.class_method("Hello from class method")  # 不需要創建類的實例調用  
obj.class_method("Hello from class method")  # 也可以通過實例調用# 輸出:  
# This is a class method of MyClass  
# Class variable: I'm a class variable  
# Argument passed to class method: Hello from class method

以上即為類中常定義的三種類型的方法,只要充分理解它們的作用與區別,就能讓我們更靈活的進行對象編程。

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

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

相關文章

golang 1.22特性之for loop

背景 go1.22版本 for loop每輪循環都生成新的變量. 原諒: https://tip.golang.org/doc/go1.22 Previously, the variables declared by a “for” loop were created once and updated by each iteration. In Go 1.22, each iteration of the loop creates new variables, to …

【C++11】自己封裝RAII類,有哪些坑點?帶你了解移動語義的真相

文章目錄 一、持有資源的類定義移動構造函數的要點1.普通內置類型與std::move2.常見的容器與std::move3.結構體:4.智能指針與std::move 參考 一、持有資源的類定義移動構造函數的要點 1.普通內置類型與std::move 在C中,std::move 主要用于對象的移動語…

Wireshark - tshark支持iptables提供數據包

tshark現在的數據包獲取方式有兩種,分別是讀文件、網口監聽(af-packet原始套接字)。兩種方式在包獲取上,都是通過讀文件的形式;存在文件io操作,在專門處理大流量的情境下, 我們復用wireshark去做…

Windows編程上

Windows編程[上] 一、Windows API1.控制臺大小設置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封裝為Innks 2.控制臺字體設置以及光標調整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…

python如何輸出list

直接輸出list_a中的元素三種方法: list_a [1,2,3,313,1] 第一種 for i in range(len(list_a)):print(list_a[i]) 1 2 3 313 1 第二種 for i in list_a:print(i) 1 2 3 313 1 第三種,使用enumerate輸出list_a方法: for i,j in enum…

Redis的使用(二)redis的命令總結

1.概述 這一小節,我們主要來研究一下redis的五大類型的基本使用,數據類型如下: redis我們接下來看一看這八種類型的基本使用。我們可以在redis的官網查詢這些命令:Commands | Docs,同時我們也可以用help 數據類型查看命令的幫助文檔。 2. 常…

數據結構 - C/C++ - 串

字符處理 C 特性 C語言中字符串存儲在字符數組中,以空字符\0結束。 字符串常量,const char* str "Hello",存儲在只讀的數據段中。 布局 字符串在內存中是字符連續存儲的集合,最后一個字符為空字符(ASCII值為0)&…

opencascade AIS_InteractiveContext源碼學習7 debug visualization

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允許您在一個或多個視圖器中管理交互對象的圖形行為和選擇。類方法使這一操作非常透明。需要記住的是,對于已經被交互上下文識別的交互對象,必須使用上下文方法進行…

【問題已解決】Vue管理后臺,點擊登錄按鈕,會發起兩次網絡請求(竟然是vscode Compile Hero編譯插件導致的)

問題 VueElement UI 做的管理后臺,點擊登錄按鈕,發現 接口會連續掉兩次,發起兩次網絡請求,但其他接口都是正常調用的,沒有這個問題,并且登錄按鈕也加了loading,防止重復點擊,于是開…

搜索引擎常用語法

引號 (" "): 用雙引號將詞組括起來,搜索引擎將返回包含完全相同短語的結果。 示例:"人工智能發展趨勢" 減號 (-): 在關鍵詞前加上減號可以排除包含特定詞語的結果。 示例:人工智能 -機器學習(排除包含 “機器…

樸素貝葉斯解密:sklearn中的分類器工作原理

📚 樸素貝葉斯解密:sklearn中的分類器工作原理 在機器學習領域,樸素貝葉斯分類器因其簡單、高效而廣受歡迎。特別是在處理大量特征數據時,樸素貝葉斯表現出了卓越的性能。scikit-learn(簡稱sklearn)是Pyth…

JavaMySQL 學習(基礎)

目錄 Java CMD Java發展 計算機存儲規則 Java學習 switch新用法(可以當做if來使用) 數組定義 隨機數 Java內存分配 MySQL MySQL概述 啟動和停止 客戶端連接 數據模型 關系型數據庫 SQL SQL通用語法 SQL分類 DDL--數據定義語言 數據庫…

瀏覽器開發者工具輔助爬蟲開發

文章目錄 瀏覽器開發者工具輔助爬蟲開發打開開發者工具使用Network面板分析請求數據示例步驟: 使用Elements面板查看和修改DOM結構示例步驟: 使用Console面板調試JavaScript代碼示例步驟:示例代碼:1. 輸出日志信息2. 輸出對象信息…

Vue 與 React 區別

Vue.js和React是現代Web開發中兩種非常流行的前端框架,兩者在**核心概念、組件以及生態系統擴展性**等方面存在區別。具體分析如下: 1. **核心概念** - **Vue**:Vue是一個漸進式JavaScript框架,它致力于視圖層,易于上手…

左值右值, 左值引用右值引用,完美轉發

一. 左值和右值 左值: 可以取地址的對象 右值: 不可以取地址的對象 double x1.0, y 2.0; 1; // 字面量, 不可取地址, 是右值 x y; // 表達式返回值, 不可取地址, 是右值 max(x, y); // 傳值返回函數的返回值 (非引用返回)總結就是: 根據是否可以取地址來區分是左值還…

線程池666666

1. 作用 線程池內部維護了多個工作線程,每個工作線程都會去任務隊列中拿取任務并執行,當執行完一個任務后不是馬上銷毀,而是繼續保留執行其它任務。顯然,線程池提高了多線程的復用率,減少了創建和銷毀線程的時間。 2…

git修改已提交的commit注釋

在Git中修改已經提交的commit注釋通常有以下幾種情況和相應的方法: 1. 修改最后一次提交的注釋(快速修正) 如果你想要修改的是最后一次提交的注釋,可以使用 --amend 選項: git commit --amend這個命令會將你的暫存區…

基于深度學習的光度檢測

基于深度學習的光度檢測(Photometric Detection)涉及從圖像中檢測和分析光照信息,用于多種應用,如場景理解、照明調節、增強現實(AR)、圖像增強等。以下是關于這一領域的系統介紹: 1. 任務和目…

JAVA基礎教程DAY1-類與方法及形參實參

首先經過C語言的學習,我們已經學會了基本的編程方法,我們知道C語言是面向過程的編程語言,而JAVA是面向對象的編程語言,所以接下來我們通過對比和舉例來進行JAVA語言的學習 首先我們來講類的概念 類:類是一個模板&…

Ubuntu開通5005端口 記錄

Ubuntu版本:20.04 使用systemctl status firewalld查看防火墻狀態,報錯Unit firewalld.service could not be found 報錯的原因是沒有安裝firewall,安裝命令為sudo apt install firewalld,然后進行安裝 安裝完成后輸入systemctl…