網站首頁 編程語言 正文
在python的類中會使用到“self”,本文主要是談談類中的self和變量的關系。
先看示例代碼I。
class Test(object):
def __init__ (self, val1):
self.val0 = val1
def fun1(self):
print(self.val0)
def fun2(self, val2):
print(val2)
def fun3(self):
print(self.fun1)
self.fun1()
ins=Test(123)
ins.new_val=”I'm a new value”
1、self是什么
在python的類中self代表實例本身,具體來說,是該實例的內存地址。
在調用實例的方法時,Python解釋器會自己把實例變量傳給類的函數中的self。
以上述代碼I為例
代碼I定義了一個類Test,在這個類中,self為參數變量,在類Test實例化得到實例ins時,python解釋器自動調用__init__,執行Test.init(ins, 123),該self可接收實例ins的內存地址,從而self代表了
實例本身。類似的,如果實例化ins后,執行ins.fun1( ),python解釋器會將ins.fun1( )解釋成Test.fun1(ins)。可見,self這個變量是無需用戶手動傳送值的,解釋器會自動幫我們給其傳遞實例。
需要注意的是,self不是關鍵字,換言之,可以用其它的合法變量名替換self,但是,規范和標準建議我們一致使用self。
2、self的使用場景
在類中,self的使用有下面3個場景
1)self為類中的函數的第一個參數,例如在類中,def fun1(self, …)。
上文說過,“在調用實例的方法時,Python解釋器會自己把實例變量傳給類的函數中的self”,如果類的函數的第一個參數不是代表實例的self,則調用實例的方法時,該方法沒有參數接收解釋器自動傳入的實例變量,從而程序會產生異常。
事實上,“和普通的函數相比,在類中定義的函數只有一點不同,就是第一個參數永遠是實例變量self,并且,調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什么區別,所以,你仍然可以用默認參數、可變參數、關鍵字參數和命名關鍵字參數”(廖雪峰老師說的)。
2)在類中,引用實例的屬性,示例:self.變量名(如self.val0)。
引用實例的屬性的目的是為實例綁定屬性、寫入或讀取實例的屬性。
例如,在代碼I中,在類的函數__init__中,“self.val1 = val1”將屬性val0綁定到了實例self(類實例化成ins后,self就代表實例ins了)上,并且將變量val1的值賦給了實例的屬性val0。
在函數fun1中,print(self.val0),讀取了實例self的值val0,并打印出來,當然,在函數中修改屬性val0的值也是可以的。
3)在類中,調用實例的方法,例如,self.fun1();獲取實例的方法的地址,例如self.fun1。
類是抽象的模板,而實例是根據類創建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數據可能不同。既然,self代表實例,則可以“self.函數名”的方式表示實例的方法地址,以“self.函數名()”的方式,調用實例的方法。在類的定義中,以及實例化后對實例方法的調用,都可以這樣做。
3、python的幾種變量——按作用域分
1、全局變量:在模塊內、在所有函數外面、在class外面,這就是全局變量。
2、局部變量:在函數內、在class的方法內(未加self修飾的) ,這就是局部變量
3、靜態變量(也可以說,類屬性):在class內的,但不在class的方法內的,這就是靜態變量
4、實例變量(也可以說,實例屬性):在class的方法內的,用self修飾的變量,這就是實例變量
注意,根據其他的分類方法可以得到其他的類別,例如私有變量。
4、self和變量的關系
綜合上述的1、2和3點,可以得到在類中,self和變量的關系了,一言以蔽之,被self修飾的變量是實例變量,不被self修飾的變量不是實例變量。
實例變量有什么作用,或者說,什么時候應該使用self修飾變量比較好?我的總結如下:
當我們想將某個變量綁定給實例時,就在類中,使用self修飾該變量。一般來說,類實例化為不同實例后,為了不同實例的某一變量互不干擾,就將該變量綁定給實例。
具體的使用場景
1)若需要在類的不同方法中調用同一變量,且屬于同一個類的不同實例的該變量互不影響(即排除類屬性),則在類中將該變量綁定給實例。
2)需要在類實例化得到實例后,修改、或引用實例的某變量,則在類中將該變量綁定給實例。
5、一點補充
為實例綁定屬性有兩種方式
1)在類的函數__init__中,為實例綁定變量。
這也是本文討論的場景。
根據pep8,所有的加了self的變量,需要確保是在__init__中首次出現,雖然不這樣做有些場景下程序也不會出錯,但按照規定來吧。
2)在實例化后,為實例綁定新的屬性。例如,實例變量.屬性變量=值
由于Python是動態語言,從而,根據類創建的實例可以任意綁定屬性。通過實例變量給實例綁定屬性是方法之一,例如代碼I中的,ins.newval=”I’m a new value”,為實例綁定了屬性newval。不過,這不是本文討論的關注點。
原文鏈接:https://blog.csdn.net/to_qin/article/details/90276793
相關推薦
- 2022-09-04 Go語言之嵌入類型詳解_Golang
- 2022-11-26 詳解redis-cli?命令_Redis
- 2022-03-20 ajax和fetch的區別點總結_AJAX相關
- 2022-01-01 stopPropagation是什么意思以及什么是事件的原理
- 2022-03-25 在?ASP.NET?Core?中為?gRPC?服務添加全局異常處理_ASP.NET
- 2023-01-07 Android?RecyclerLineChart實現圖表繪制教程_Android
- 2022-07-08 android?studio集成unity導出工程的實現_Android
- 2024-01-15 maven常用打包命令
- 最近更新
-
- 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同步修改后的遠程分支