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

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