调用的关键在第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.方法名
的格式。
网友评论