类的调用和self的理解

2019-10-31  本文已影响0人  阿互
类的调用.png

调用的关键在第7行代码:my_computer = Computer()。这个过程叫作:类的实例化,即在某个类下创建一个实例对象。

倒数第二行:my_computer.screen先是获取到类属性screen对应的值True,再用print()打印出来。

最后一行:my_computer.start()调用方法start(),这个方法的功能是直接打印出'电脑正在开机中……'。

细心的同学可能会有这样的疑惑:为什么实例调用方法时不用传参,定义时不是有个参数self吗?

这就是参数self的特殊之处:在定义时不能丢,在调用时要忽略。至于它的作用,容我再卖个关子。

正式揭秘特殊参数self的作用:self会接收实例化过程中传入的数据,当实例对象创建后,实例便会代替 self,在代码中运行。

换言之,self 是所有实例的替身,

如果要在类的外部调用类属性,我们得先创建一个实例,再用实例名.属性的格式调用吗?

那么如果想在类的内部调用类属性,而实例又还没创建之前,我们就需要有个变量先代替实例接收数据,这个变量就是参数self。

正确的写法是这样子的:(留意第六行)


传参self2.png

当最后一行代码运行时,实例person会像参数一样传给self,替换掉self,第六行的self.name等价于person.name

person.name就相当于调用了类属性name(即'吴枫'),然后跑完整个方法。

可见,self的作用相当于先给实例占了个位置,等到实例创建好就“功成身退,退位让贤”。

同理,如果想在类的方法内部调用其他方法时,我们也需要用到self来代表实例。

阅读代码后点击运行:(重点看第七行)


传参self2.png

当最后一行实例person调用say()方法时,便会执行say()内部的语句(第七行开始)。

此时self.greeting()就变成person.greeting(),也就是调用实例方法greeting(),打印出'很高兴遇见你',再打印出'我来自中国'。

综上,所以我们说self代表的是类的实例本身,方便数据的流转。对此,我们需要记住两点:

第一点:只要在类中用def创建方法时,就必须把第一个参数位置留给 self,并在调用方法时忽略它(不用给self传参)。

第二点:当在类的方法内部想调用类属性或其他方法时,就要采用self.属性名self.方法名的格式。

上一篇 下一篇

猜你喜欢

热点阅读