详谈Python中self的作用
Posted 黑羽青衣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详谈Python中self的作用相关的知识,希望对你有一定的参考价值。
其实有些小伙伴会问我,面试中遇到面试官会问到self的作用是什么?(当然,年轻时的我也被问过)
那么现在来给大家讲一下Python中self的作用。
敲过代码的都知道
我们C#或者是一些C、C++甚至是一些,通常会new一个新的对象,然后有时候会用this来引用这个对象的自身(没接触过C的当我没讲过)
而我们来看看self本身的意思是什么?
self
翻译过来通常代表着自己、自身的意思。
顾名思义,在Python中self也是代表自身自己的意思,那它代表是什么自己呢?
用过PyCharm的小伙伴可能会知道,我们在定义一个函数的时候并没有出现self的相关。
但是我们定义了一个类的时候,类的函数,都会默认第一个的参数就是self。
是的,所谓的self,可以理解为自己
可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数
class KnowTheSelf(): def __init__(self): print("正在构建一个类") def Know(self): print("知道什么是self")
New = KnowTheSelf()
New.Know()
输出结果:
正在构建一个类
知道什么是self
可以看到PyCharm在定义这个类的函数的时候,都会默认带入一个参数,而这个参数,就是类的实例的自己
这种用法跟C++的this的用法如出一辙,只不过self是个约定俗成的名称,在你没有改变这个名称之前,咱们约定好就叫这个,久而久之,有些人也懒得去改变,所以就一般以self来定义。
事实上,Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为 self,只是程序员之间约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性(大家一看到 self,就知道它的作用)。
那么,self
参数的具体作用是什么呢?打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?
当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。
如果你接触过其他面向对象的编程语言(例如 C++),其实 Python 类方法中的 self 参数就相当于 C++ 中的 this 指针。
也就是说,同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。
因此,程序在调用实例方法和构造方法时,不需要手动为第一个参数传值。
class KnowTheSelf(): def __init__(self): print("正在构建一个类") def Know(self): print(self,"知道什么是self") New = KnowTheSelf() New.Know()
上面代码中,Know() 中的 self 代表该方法的调用者,即谁调用该方法,那么 self 就代表谁。因此,该程序的运行结果为
正在构建一个类 <__main__.KnowTheSelf object at 0x000001DDA4523978> 知道什么是self
另外,对于构造函数中的 self 参数,其代表的是当前正在初始化的类对象。看看下面的例子
class KnowTheSelf(): def __init__(self, name): self.name = name New = KnowTheSelf("张三") print(New.name)
输出结果:
张三
可以看到,KnowTheSelf在初始化的时候,调用的构造函数中 self 代表的是 张三
显然,无论采用哪种方法,self 所表示的都是实际调用该方法的对象。
总之,无论是类中的构造函数还是普通的类方法,实际调用它们的谁,则第一个参数 self 就代表谁。
以上是关于详谈Python中self的作用的主要内容,如果未能解决你的问题,请参考以下文章