引言
我经常会在别人代码的方法里看到这样一个变量‘self’
有的是这样的
class tools:
self='hallo world!'
def Printit(self):
text=self
print(text)
还有的是这样的:
class tools:
def printit(self):
print('hallo world!')
另外建立方法和类的时候IDE的迅速填充中会有一个也会有self
我就以为self只是一个占位符,可以当变量用,也可以不用(这些大佬只是懒得删而已)
于是乎,我在写类和方法的时候从来不加self……就出现了各种各样的bug。
所以……什么是self
模块在被引用的时候,如果你想要用里面的类和方法,是需要进行实例化的。
举个例子:
mod.py
class tools:
def printit(self):
print('hallo world!')
这个模块在引用的时候应该这样
test.py
import mod
a=mod.tools()
a.printit()
这个过程中的a=hallo.tools()
就是实例化
同样一个方法,可能在你的程序中会被调用很多次,方法也会被输入不同的参数,这个时候,电脑该如何分辨哪个参数是哪次调用输入的呢?
这就是self
的用处了
self相当于一个标识符,每次调用的时候,会将self作为第一个参数传进你的方法中,用来标记你的方法。
也就是说,这是个一定会传进去的参数!
那么bug就来了,我之前从来不写self,直接是需要用的参数开头,比如这样
mod.py
class tools():
def fx(x,y):
z=x+y
return z
这个时候,如果我在另外一个程序来调用他
import mod
a=mod.tools()
a.fx(1,2)
这个时候,self会作为第一个参数传进去。也就是我这个方法实际上得到了self,x,y三个参数
就会出现“需要两个参数但是你给了仨”的错误
如果我设定的是关键字参数,则会出现第一个关键字参数被重复传参的错误
不难理解,self是以位置参数被传进去的,这时候你在定义的时候只给了x,y,那么我的self就会传进第一个参数x里
与此有关的还有一大串bug在等着你
在py3.8+中,还有这样的一个标识符*,
作用是表示在这个符号后面的参数都是关键字参数。
如果你这么定义方法def fx(*,x,y):
那么你调用的时候出现的位置参数self会引起”需要零个位置参数但是你给了一个位置参数(和两个关键字参数)”的错误信息。
那么……什么时候该有个self呢?
我前面说到,我们在将一个对象实例化后引用它,会自动传入一个self进行标识。那么如果我不将他实例化直接使用(举个例子就是程序的内置方法)就不会传入self,这个时候如果不加self也不会出bug。并且有些像是获取数据类型之类的方法为了效率高,我们不会设置一个关键字参数在里面,直接用位参,你设置一个self反而会出现缺少参数的情况(因为你这个时候并没有传入self),所以这个时候我是不会加self的。
另外一种就是写模块,也就是从另一个py文件中调用,这个时候是需要进行实例化的,也就是如果你这个方法是一个给外部预留的接口之类的,那么就要加上一个self了,不然就会出现之前的错误。
最后(没啥用,赶时间的可以直接跳过)
以上的看法只是个人理解,我也只是自学不久,如果有错误希望大佬们评论指正,会跟进修改。