问题:Python 中的self的作用是什么?
这其实是函数和类的区别,函数不需要self,类需要这个参数。
以下对比函数和类,从中体会self的作用:
一、函数
先看函数:
函数运行结果如下:
输出结果二、类
正常的类是这样的:
类(一)第一次尝试
第一次尝试,把__init__函数的self.name改为name,结果是属性错误:“dog”对象没有属性“name”,如下:
第一次尝试明明类里面的函数__init__函数有name这个参数,但是程序却无法识别,原因是my_dog.name引用的是self.name,而不是name。整个过程是:旺财给了__init__函数的name,name再给到self.name,self.name再给到my_dog.name。
因此推断:self的作用之一是代替my_dog。Dog类编写的时候,并不知道用户取了名为my_dog的变量,所以需要使用通用的self来代替my_dog。
所以,__init__函数中的self.name=name不是废话,是有用的。
(二)第二次尝试
把最后面的两句print放到__init__函数里面,这时候my_dog.name可以使用name了,如下图:
这时候还需要self吗?
第二次尝试,把第一个函数__init__中的self删掉,结果程序报错:__init__只有两个参数,但是给了3个值,如下:
第二次尝试推断,这个多给的是程序自动给的参数,就是self,即调用类的时候,程序自动给类里面的函数的第一个参数是self,为了看到这个自动给的参数,我删掉“旺财”,结果如下:
因此,self的作用之一是自动给类里面的函数第一个参数赋值。
同时此时,程序报错,“dog”对象没有属性“name”,因为sit函数里面没有name这个参数。通过给所有函数加上第一个参数self,就正常运行了:
这和原来的程序相比,现在sit函数和roll_over函数需要两个参数。原来的程序之所以只需要一个参数,是因为name加了self前缀可以在类里面的各函数中使用,所以:
self的作用之一节省变量,让函数更简洁。
但是,仅仅在name前面加上self前缀是不行的,还要在__init__ 函数中先定义self.name=name。
综上,self是类的核心,是与函数的主要区别,self的作用包括,代替实例中的变量;自动给类里面的函数第一个参数赋值;节省变量,让函数更简洁。
网友评论