类的调用.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.方法名的格式。








网友评论