详解 Python 类中的 self 参数

在使用 Pycharm 编写类中的方法的时候,会发现不需要自己主动写上 self ,它会自动默认有一个参数叫 self,且在方法的第一个参数的位置上。

这个 self 参数是对类的当前实例的引用,用于访问该类中的变量。简单来说就是哪一个对象调用的方法,方法的第一个参数 self 就是哪一个对象的引用。

它可以不叫 self,可以叫其他的名字,但是 self 必须是类中任意方法的第一个参数。调用方法时不需要给 self 传参

在方法的内部可以通过 self.属性名 访问对象的属性,还可以通过 self.方法名 调用其他的对象方法。

# Python解释器遇到类并不立即执行,只是知道这里定义了一个Person类
class Person:
    def __init__(self, name):
        self.name = name

    def play(self):
        # 哪一个对象调用的方法,self就是哪一个对象的引用
        print(self)
        print('%s在打球。' % self.name)


# 创建一个Person对象,让变量per对这个对象进行了一个引用
per = Person('Alice')
print(per)
# per.name = 'Alice'   # 给per对象增加了一个属性name,其中存储的字符串是'Alice'
per.play()  # per对象调用play方法,这时将per对象传入play方法中的self参数

# 创建第二个Person对象赋给变量per1
per1 = Person('Tom')
print(per1)
# per1.name = 'Tom'
per1.play()

输出结果:

图片[1]-详解 Python 类中的 self 参数-尤尤'blog

从上面的执行结果就可以看出:哪一个对象调用的方法,self 就是哪一个对象的引用。

通过断点调试可以清晰的看到这个过程。

断点调试

1)首先给 “per = Person(‘Alice’)” 这行代码打上断点,然后进入 Debug 模式。按 Step Over(F8),单步执行,不需要进入 Person 类的内部。

从结果中可以看到 per 这个对象的内存地址是 9F5900:

图片[2]-详解 Python 类中的 self 参数-尤尤'blog

2)然后继续 F8,执行完 “print(per)”,然后 F7(Step Into),进入 play() 方法中。

和1)中的结果做对比,发现当 per 这个对象调用 play() 方法时,self 的内存地址和 per 实例对象的内存地址是一样的,都是 9F5900:

图片[3]-详解 Python 类中的 self 参数-尤尤'blog

也就是说:当实例对象 per 调用 play() 方法时,self 就是 per 实例对象的引用。

3)F8(Step Over)一直执行,直到创建完第二个 Person 对象,并赋值给 per1 变量(per = Person(‘Tom’))。

执行完创建对象 per1 的代码后,可以看到这时 per1 实例对象的内存地址是 997B50,且有一个实例属性 name,属性值为 Tom。

图片[4]-详解 Python 类中的 self 参数-尤尤'blog

4)然后 F7(Step Into)进入 play() 函数中。

此时是 per1 这个实例对象调用的 play() 方法,F7 进入函数后,可以看出现在 play() 方法中的 self 参数记录的是 per1 的内存地址 997B50:

图片[5]-详解 Python 类中的 self 参数-尤尤'blog

综合上面的结果可以看到:当 per 这个实例对象(name = ‘Alice’)调用 play() 方法时,self 记录的就是 per 实例对象的内存地址;当 per1 这个实例对象(name = ‘Tom’)调用 play() 方法时,self 记录的就是 per1 实例对象的内存地址;

也就是说:self 参数是对类的当前实例的引用。即哪一个实例对象调用的方法,self 就是哪一个对象的引用。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容