python self关键字的通俗解释

我们先来看一段代码:

	class  A():
		def function1(text):
			print(text);
		def function2(self,text):
			print(text);

定义一个类A,A中有两个方法,一个不带self关键字的方法function1,一个带self关键字的方法function2,我们调用一下

//根据我们语言学习的经验,我们知道调用一个类的方法首先要实例化这个类
//什么叫实例化,就是我们定义了一个类,但仅仅是告诉计算机,有这么一个东西,但计算机并没有生成这个东西,
//只有实例化,计算机才在内存中开辟一段空间,然后生成一个类扔到这个空间去,
//所以我们首先实例化
 a = A();
 //调用A类的function2
 a.function2("python"); //语句(1)
 A.function2(a,"python");//语句(2)
 a.function1("python");
 运行结果:
 python
 python
 报错:TypeError: sing() missing 1 required positional argument: 'one'

我们发现,语句(1)(2)的执行结果相同,且编译器未报错。语句(3)报错
我们先看语句(1),语句(1)中,我们定义的function2方法中明明含有两个参数self和text,但我们调用的时候仅仅给一个参数(text)赋值,并没有给self传入值,但是一样调用。
再看语句(2),我们直接使用A.function2来调用A的方法,按照正常的实例化不应该是使用A的实例化对象a来调用方法吗?这时候,我们已经隐约知道self的作用了。
self关键字,其实就是起到实例化本身的作用
在语句(1)中,我们的a,已经是A的实例化了, 所以不需要再给self关键字传入值来实例化。
在语句(2)中,虽然A不是实例化,仅仅是一个类名,但是我们传入了一个A的实例化a,(function2(a,“python”))。
我们用自然语言来解释这俩个语句:

a.function2("python");//我们实例化一个A的对象a,a要调用function2
					//检测到a已经是A的实例化对象,所以不需要再实例化A了,	self关键字不需要新建一个A的实例了
					//	self关键字将自动绑定实例
A.function2(a,"python");//A不是一个实例化对象,所以我们必须要对A进行实例化,a是A的实例化对象,我们把a传入
					//代表实例化A,同时绑定这个实例化
a.function1("python");//我新建一个A的实例a,想用a调用function1方法,但是,虽然我有a的实例,但是我没有将这个实例传入
					//所以报错

因此,我们总结一下,self关键字是必要的,你可以调用方法的时候,可以不填这个self参数,填不填这个参数是你的事,但是创建方法的时候,第一个参数必须是self,不写就是不行,它起到一个将实例化自身,并绑定实例化的作用。

我们在实验一下,在方法里的属性加上self关键字

x = 5;
class A():
def defineValue(self):
    self.x = 10;
def putSelf(self):
    print(x);

a =  A();
a.putSelf();
输出结果:
5

我们发现,方法putSelf调用的是外部的x,而不是自身的self.x,因为只有带self的属性,才是自身的属性,不带self的,那就是外部属性了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种面向对象、解释型、动态类型的编程语言。Python关键字(keywords)是指在Python中具有特殊意义的单词,不能作为变量名、函数名、类名等标识符,而是被用于语言本身的语法结构中。 以下是Python关键字及其解释: - `False`: 布尔类型的假值。 - `True`: 布尔类型的真值。 - `None`: 表示空值或缺失值。 - `and`: 逻辑运算符,表示逻辑与。 - `as`: 用于别名,将一个模块或对象赋予另一个短一些的名称。 - `assert`: 断言,用于确保某个条件为真,否则会引发AssertionError异常。 - `break`: 跳出当前循环。 - `class`: 类的关键字。 - `continue`: 结束本次循环,继续进行下一次循环。 - `def`: 定义函数。 - `del`: 删除对象。 - `elif`: else if,用于多分支判断语句。 - `else`: 否则语句。 - `except`: 异常处理语句。 - `finally`: 异常处理语句中的finally代码块。 - `for`: for循环语句。 - `from`: 从模块中导入指定函数或类。 - `global`: 声明全局变量的关键字。 - `if`: 条件语句。 - `import`: 导入模块。 - `in`: 成员运算符,用于判断一个值是否在一个序列中。 - `is`: 身份运算符,用于判断两个对象是否是同一个对象。 - `lambda`: 匿名函数。 - `nonlocal`: 声明外层非全局变量。 - `not`: 逻辑运算符,表示逻辑非。 - `or`: 逻辑运算符,表示逻辑或。 - `pass`: 空语句,占位符。 - `raise`: 抛出异常。 - `return`: 函数返回值。 - `try`: 异常处理语句的开始。 - `while`: while循环语句。 - `with`: 上下文管理器,用于自动关闭文件或释放资源。 - `yield`: 生成器函数的关键字

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值