Python self 參數詳解 [OOP][self 參數的具體作用][調用類的實例方法的不同方式]

您的“關注”和“點贊”,是信任,是認可,是支持,是動力…

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

1 self 參數概述

Python 中的方法(構造方法或實例方法)至少要包含一個參數,並且方法的第一個參數通常被命名爲 self

但是要注意,不遵循此約定會使得你的代碼對其他 Python 程序員來說缺乏可讀性。

舉例如下所示:

class User:
    # 構造方法
    def __init__(self):
        print('執行的是構造方法。')

    # 實例方法
    def id(self, user_id):
        print('已添加 id 爲:', user_id, '的用戶。')

2 self 參數的具體作用

2.1 實例方法中的 self 參數

在 Python 中,同一個類是可以產生多個對象的,那麼當某個對象調用類方法時,該對象就會把自身的引用作爲第一個參數自動傳給該方法。

可以這麼理解,Python 會自動綁定類方法的第一個參數指向調用該方法的對象。

如此,Python 解釋器就能知道到底要操作哪個對象的方法了。

所以,程序在調用實例方法和構造方法時,不需要手動爲第一個參數傳值。

舉例說明,如下所示:

class User:
    # 構造方法
    def __init__(self):
        print('執行的是構造方法。')

    # 實例方法
    def add_id(self, user_id):
        print(self, '添加用戶id的實例方法')  # 打印第一個參數 self,不同對象調用,值會不同

# add_id() 方法中第一個參數 self 代表該方法的調用者,即哪個對象調用該方法,那麼 self 就代表哪個對象


user1 = User()  # 創建 User 類的第一個 user1 對象
user1.add_id('001')  # add_id() 方法中第一個參數 self 代表 user1 對象

user2 = User()  # 創建 User 類的第二個 user2 對象
user2.add_id('002')  # add_id() 方法中第一個參數 self 代表 user2 對象

運行結果:

執行的是構造方法。
<__main__.User object at 0x000002B0E85A7400> 添加用戶id的實例方法
執行的是構造方法。
<__main__.User object at 0x000002B0E85E5EE0> 添加用戶id的實例方法

2.2 構造方法中的 self 參數

對於構造函數中的 self 參數,其代表的是當前正在初始化的類對象。

舉例如下所示:

class User:
    # 構造方法中的 self 參數,其代表的是當前正在初始化的類對象。
    def __init__(self):
        print(self, '執行的是構造方法。')


user1 = User()  # 構造方法中的第一個參數 self 代表的對象是 user1
user2 = User()  # 構造方法中的第一個參數 self 代表的對象是 user2

運行結果:

<__main__.User object at 0x000001B73B437400> 執行的是構造方法。
<__main__.User object at 0x000001B73B4225E0> 執行的是構造方法。

3 通過調用類的實例方法進行驗證 self 參數

3.1 類對象直接調用類的實例方法

舉例如下所示:

class User:
    # 構造方法在類的實例化過程中執行
    def __init__(self):
        print('執行的是構造方法。')

    # 實例方法
    def add_id(self):
        print(self, '添加用戶id的實例方法')


user1 = User()  # 類的實例化
user1.add_id()  # 類對象調用類的實例方法

運行結果:

執行的是構造方法。
<__main__.User object at 0x00000144B63E7400> 添加用戶id的實例方法

3.2 通過某個變量調用類的實例方法

class User:
    # 構造方法在類的實例化過程中執行
    def __init__(self):
        print('執行的是構造方法。')

    # 實例方法
    def add_id(self):
        print(self, '添加用戶id的實例方法')


user1 = User()  # 類的實例化
add_id = user1.add_id  # 把 user1.add_id 賦值給 add_id 變量
add_id()  # 通過 add_id 變量調用 user1 對象中的 add_id() 方法

運行結果:

執行的是構造方法。
<__main__.User object at 0x00000183252F7400> 添加用戶id的實例方法

3.3 小結

無論採用類對象直接調用類的實例方法,還是通過某個變量調用類的實例方法,self 所表示的都是實際調用該方法的對象。

於是乎,無論是類中的構造函數還是普通的類方法,實際調用它們的對象是哪個,則第一個參數 self 就代表哪個。

【文章其它地址】

微信公衆號:碼農阿杰

博客園

【參考資料】

Python 官網

Python 3.8.2 documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章