網站首頁 編程語言 正文
在定義類的過程中,無論是顯式創建類的構造方法,還是向類中添加實例方法,都要求將 self 參數作為方法的第一個參數。例如,定義一個 Person 類:
class Person:
def__init__(self):
print("正在執行構造方法")
# 定義一個study()實例方法
defstudy(self,name):
print(name,"正在學Python")
那么,self 到底扮演著什么樣的角色呢?本節就對 self 參數做詳細的介紹。
事實上,Python 只是規定,無論是構造方法還是實例方法,最少要包含一個參數,并沒有規定該參數的具體名稱。之所以將其命名為 self,只是程序員之間約定俗成的一種習慣,遵守這個約定,可以使我們編寫的代碼具有更好的可讀性(大家一看到 self,就知道它的作用)。
那么,self 參數的具體作用是什么呢?打個比方,如果把類比作造房子的圖紙,那么類實例化后的對象是真正可以住的房子。根據一張圖紙(類),我們可以設計出成千上萬的房子(類對象),每個房子長相都是類似的(都有相同的類變量和類方法),但它們都有各自的主人,那么如何對它們進行區分呢?
當然是通過 self 參數,它就相當于每個房子的門鑰匙,可以保證每個房子的主人僅能進入自己的房子(每個類對象只能調用自己的類變量和類方法)。
如果你接觸過其他面向對象的編程語言(例如 C++),其實 Python 類方法中的 self 參數就相當于 C++ 中的 this 指針。
也就是說,同一個類可以產生多個對象,當某個對象調用類方法時,該對象會把自身的引用作為第一個參數自動傳給該方法,換句話說,Python 會自動綁定類方法的第一個參數指向調用該方法的對象。如此,Python解釋器就能知道到底要操作哪個對象的方法了。
因此,程序在調用實例方法和構造方法時,不需要手動為第一個參數傳值。例如,更改前面的 Person 類,如下所示:
class Person:
def__init__(self):
print("正在執行構造方法")
# 定義一個study()實例方法
defstudy(self):
print(self,"正在學Python")
zhangsan =Person()
zhangsan.study()
lisi =Person()
lisi.study()
上面代碼中,study() 中的 self 代表該方法的調用者,即誰調用該方法,那么 self 就代表誰。因此,該程序的運行結果為:
正在執行構造方法
<__main__.Person object at 0x0000021ADD7D21D0> 正在學Python
正在執行構造方法
<__main__.Person object at 0x0000021ADD7D2E48> 正在學Python
另外,對于構造函數中的 self 參數,其代表的是當前正在初始化的類對象。舉個例子:
class Person:
name ="xxx"
def__init__(self,name):
self.name=name
zhangsan =Person("zhangsan")
print(zhangsan.name)
lisi =Person("lisi")
print(lisi.name)
運行結果為:
zhangsan
lisi
可以看到,zhangsan 在進行初始化時,調用的構造函數中 self 代表的是 zhangsan;而 lisi 在進行初始化時,調用的構造函數中 self 代表的是 lisi。
值得一提的是,除了類對象可以直接調用類方法,還有一種函數調用的方式,例如:
class Person:
defwho(self):
print(self)
zhangsan =Person()
#第一種方式
zhangsan.who()
#第二種方式
who = zhangsan.who
who()#通過 who 變量調用zhangsan對象中的 who() 方法
運行結果為:
<__main__.Person object at 0x0000025C26F021D0>
<__main__.Person object at 0x0000025C26F021D0>
顯然,無論采用哪種方法,self 所表示的都是實際調用該方法的對象。
總之,無論是類中的構造函數還是普通的類方法,實際調用它們的誰,則第一個參數 self 就代表誰。
原文鏈接:https://blog.csdn.net/m0_74309242/article/details/128776730
相關推薦
- 2023-09-12 spring webflux配置成tomcat的線程池
- 2022-06-25 Android開發跳轉應用市場進行版本更新功能實現_Android
- 2022-09-05 Shiro和Security的核心模塊以及兩者的區別
- 2022-04-05 C++繼承和動態內存分配_C 語言
- 2022-11-17 Go語言學習教程之指針的示例詳解_Golang
- 2022-09-16 Go?WEB框架使用攔截器驗證用戶登錄狀態實現_Golang
- 2023-05-23 numpy數組之讀寫文件的實現_python
- 2022-07-09 C++深入探索內聯函數inline與auto關鍵字的使用_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支