在使用 Pycharm 编写类中的方法的时候,会发现不需要自己主动写上 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()
输出结果:
从上面的执行结果就可以看出:哪一个对象调用的方法,self 就是哪一个对象的引用。
通过断点调试可以清晰的看到这个过程。
断点调试
1)首先给 “per = Person(‘Alice’)” 这行代码打上断点,然后进入 Debug 模式。按 Step Over(F8),单步执行,不需要进入 Person 类的内部。
从结果中可以看到 per 这个对象的内存地址是 9F5900:
2)然后继续 F8,执行完 “print(per)”,然后 F7(Step Into),进入 play() 方法中。
和1)中的结果做对比,发现当 per 这个对象调用 play() 方法时,self 的内存地址和 per 实例对象的内存地址是一样的,都是 9F5900:
也就是说:当实例对象 per 调用 play() 方法时,self 就是 per 实例对象的引用。
3)F8(Step Over)一直执行,直到创建完第二个 Person 对象,并赋值给 per1 变量(per = Person(‘Tom’))。
执行完创建对象 per1 的代码后,可以看到这时 per1 实例对象的内存地址是 997B50,且有一个实例属性 name,属性值为 Tom。
4)然后 F7(Step Into)进入 play() 函数中。
此时是 per1 这个实例对象调用的 play() 方法,F7 进入函数后,可以看出现在 play() 方法中的 self 参数记录的是 per1 的内存地址 997B50:
综合上面的结果可以看到:当 per 这个实例对象(name = ‘Alice’)调用 play() 方法时,self 记录的就是 per 实例对象的内存地址;当 per1 这个实例对象(name = ‘Tom’)调用 play() 方法时,self 记录的就是 per1 实例对象的内存地址;
也就是说:self 参数是对类的当前实例的引用。即哪一个实例对象调用的方法,self 就是哪一个对象的引用。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
暂无评论内容