溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python self有哪些用法

發布時間:2020-08-26 16:53:02 來源:億速云 閱讀:227 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關python self有哪些用法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

對于在類體中定義的實例方法,Python 會自動綁定方法的第一個參數(通常建議將該參數命名為 self),第一個參數總是指向調用該方法的對象。根據第一個參數出現位置的不同,第一個參數所綁定的對象略有區別:

在構造方法中引用該構造方法正在初始化的對象。

在普通實例方法中引用調用該方法的對象。

由于實例方法(包括構造方法)的第一個 self 參數會自動綁定,因此程序在調用普通實例方法、構造方法時不需要為第一個參數傳值。

self 參數(自動綁定的第一個參數)最大的作用就是引用當前方法的調用者,比如前面介紹的在構造方法中通過 self 為該對象增加實例變量。也可以在一個實例方法中訪問該類的另一個實例方法或變量。假設定義了一個 Dog 類,這個 Dog 對象的 run() 方法需要調用它的 jump() 方法,此時就可通過 self 參數作為 jump() 方法的調用者。

方法的第一個參數所代表的對象是不確定的,但它的類型是確定的,即它所代表的只能是當前類的實例;只有當這個方法被調用時,它所代表的對象才被確定下來誰在調用這個方法,方法的第一個參數就代表誰。

例如定義如下 Dog 類:

class Dog:
    # 定義一個jump()方法
    def jump(self):
        print("正在執行jump方法")
    # 定義一個run()方法,run()方法需要借助jump()方法
    def run(self):
        # 使用self參數引用調用run()方法的對象
        self.jump()
        print("正在執行run方法")

上面代碼的 run() 方法中的 self 代表該方法的調用者:誰在調用 run() 方法,那么 self 就代表誰。因此該方法表示:當一個 Dog 對象調用 run() 方法時,run() 方法需要依賴它自己的 jump() 方法。

當 Python 對象的一個方法調用另一個方法時,不可以省略 self。也就是說,將上面的 run()方法改為如下形式是不正確的:

# 定義一個run()方法,run()方法需要借助jump()方法
def run():
    #省略self,下面代碼會報錯
    self.jump()
    print("正在執行run方法")

此外,在構造方法中,self 參數(第一個參數)代表該構造方法正在初始化的對象。例如如下代碼:

class InConstructor :
    def __init__(self) :
        # 在構造方法里定義一個foo變量(局部變量)
        foo = 0
        # 使用self代表該構造方法正在初始化的對象
        # 下面的代碼將會把該構造方法正在初始化的對象的foo實例變量設為6
        self.foo = 6
# 所有使用InConstructor創建的對象的foo實例變量將被設為6
print(InConstructor().foo) # 輸出6

在 InConstructor 的構造方法中,self 參數總是引用該構造方法正在初始化的對象。程序中將正在執行初始化的 InConstructor 對象的 foo 實例變量設為 6,這意味著該構造方法返回的所有對象的 foo 實例變量都等于 6。

需要說明的是,自動綁定的 self 參數并不依賴具體的調用方式,不管是以方法調用還是以函數調用的方式執行它,self 參數一樣可以自動綁定。例如如下程序:

class User:
    def test(self):
        print('self參數: ', self)
       
u = User()
# 以方法形式調用test()方法
u.test() # <__main__.User object at 0x00000000021F8240>
# 將User對象的test方法賦值給foo變量
foo = u.test
# 通過foo變量(函數形式)調用test()方法。
foo() # <__main__.User object at 0x00000000021F8240>

上面程序中第 5 行代碼以方法形式調用 User 對象的 test() 方法,此時方法調用者當然會自動綁定到方法的第一個參數(self 參數);程序中第 11 行代碼以函數形式調用 User 對象的 test() 方法,看上去此時沒有調用者了,但程序依然會把實際調用者綁定到方法的第一個參數,因此輸出結果完全相同。

當 self 參數作為對象的默認引用時,程序可以像訪問普通變量一樣來訪問這個 self 參數,甚至可以把 self 參數當成實例方法的返回值??聪旅娉绦颍?/p>

class ReturnSelf :
    def grow(self):
        if hasattr(self, 'age'):
            self.age += 1
        else:
            self.age = 1
        # return self返回調用該方法的對象
        return self
rs = ReturnSelf()
# 可以連續調用同一個方法
rs.grow().grow().grow()
print("rs的age屬性值是:", rs.age)

從上面程序中可以看出,如果在某個方法中把 self 參數作為返回值,則可以多次連續調用同一個方法,從而使得代碼更加簡潔。但是這種把 self 參數作為返回值的方法可能會造成實際意義的模糊,例如上面的 grow 方法用于表示對象的生長,即 age 屬性的值加 1,實際上不應該有返回值。

看完上述內容,你們對python self有哪些用法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女