首頁 > 軟體

python類中的self和變數用法及說明

2022-11-25 14:01:00

在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。不過,這不是本文討論的關注點。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com