<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在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」
在python的類中self代表範例本身,具體來說,是該範例的記憶體地址。
在呼叫範例的方法時,Python直譯器會自己把範例變數傳給類的函數中的self。
程式碼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。
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.函數名()”的方式,呼叫範例的方法。在類的定義中,以及範例化後對實體方法的呼叫,都可以這樣做。
1、全域性變數:在模組內、在所有函數外面、在class外面,這就是全域性變數。
2、區域性變數:在函數內、在class的方法內(未加self修飾的) ,這就是區域性變數
3、靜態變數(也可以說,類屬性):在class內的,但不在class的方法內的,這就是靜態變數
4、範例變數(也可以說,範例屬性):在class的方法內的,用self修飾的變數,這就是範例變數
注意,根據其他的分類方法可以得到其他的類別,例如私有變數。
綜合上述的1、2和3點,可以得到在類中,self和變數的關係了,一言以蔽之,被self修飾的變數是範例變數,不被self修飾的變數不是範例變數。
範例變數有什麼作用,或者說,什麼時候應該使用self修飾變數比較好?我的總結如下:
當我們想將某個變數繫結給範例時,就在類中,使用self修飾該變數。一般來說,類範例化為不同範例後,為了不同範例的某一變數互不干擾,就將該變數繫結給範例。
1)若需要在類的不同方法中呼叫同一變數,且屬於同一個類的不同範例的該變數互不影響(即排除類屬性),則在類中將該變數繫結給範例。
2)需要在類範例化得到範例後,修改、或參照範例的某變數,則在類中將該變數繫結給範例。
1)在類的函數__init__中,為範例繫結變數。
這也是本文討論的場景。
根據pep8,所有的加了self的變數,需要確保是在__init__中首次出現,雖然不這樣做有些場景下程式也不會出錯,但按照規定來吧。
2)在範例化後,為範例繫結新的屬性。例如,範例變數.屬性變數=值
由於Python是動態語言,從而,根據類建立的範例可以任意繫結屬性。通過範例變數給範例繫結屬性是方法之一,例如程式碼I中的,ins.newval=”I’m a new value”,為範例繫結了屬性newval。不過,這不是本文討論的關注點。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45