当程序加载到内存开始运行时,那么函数代码会加载多份到内存吗?
# 飞机1
plane1 = HeroPlane(10, 100)
plane1.fly()
# 飞机2
plane2 = HeroPlane(15, 100)
plane2.fly()
我们可以看出无论是plane1的fly()函数还是plane2()的fly()函数,是完全一样的实现,同时我们也知道计算机的内存是非常宝贵的资源,不容的大肆浪费。所以在程序设计的时候,只将函数加载到内存中一份,不同的对象共享同一个函数,如下图所示:
注意:对象的实例属性是独有的,函数代码是共享的。函数共享,就会出现一个问题,当通过对象去调用fly()函数的时候,fly()函数如何区分是那个对象调用它?答案就是self参数。
# 飞机1
plane1 = HeroPlane(10, 100)
plane1.fly() # 等价于 fly(plane1)
# 飞机2
plane2 = HeroPlane(15, 100)
plane2.fly() # 相当于fly(plane2)
所以类内的实例方法第一参数都必须是self,而且self参数是由python自动帮我传递的,我们不需要手动传递。
self的作用就是用来区分函数是由那个对象调用。