[Python 新人向]关于self(python 传参时总是多一个参数)

引言

我经常会在别人代码的方法里看到这样一个变量‘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了,不然就会出现之前的错误。

最后(没啥用,赶时间的可以直接跳过)

以上的看法只是个人理解,我也只是自学不久,如果有错误希望大佬们评论指正,会跟进修改。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值