您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
文章目录
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
就代表哪个。