大家好,欢迎来到IT知识分享网。
Python self
在定义类的过程中,无论是显示创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Person 类:
class Person: # 定义Person类 def __init__(self): # 构造方法 print("正在执行构造方法") def study(self,name): # 定义study()实例方法 print(name,"正在学Python")
所以,self 到底是什么?接下来就听我深入分析。
事实上,Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为 self,只是程序员之间约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性(大家一看到 self,就知道它的作用)。
那么,self 参数的具体作用是什么呢?
如果想象成房子,那么房子的图纸就是这个类,类的实例化之后的对象是一个真正可以住的房子。但是一个图纸,可以设计出成千上万套房子,也就是说,一个类,可以存在成千上万个对象;每个房子长相基本相似,也就是说都有相同的类变量和类方法;但是他们都有各自的主人,该如何对他们进行区分呢?
这时候就需要用到 self 了,他就相当于每个房子的钥匙,可以保证每个房子的主人仅能进入到自己的房子,即每个类对象只能调用自己的类变量和类方法。
也就是说,同一个类可以有多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就知道到底要操作哪个对象了。
这跟 Java 中的 this 有点相似,有 Java 基础的人会更容易理解。
如果你还是不理解,下面根据一段代码来逐步分析 self
class demo_self: def __init__(self): print("図面に沿って家を建てている:", end=' ') # 正在按照图纸建造房子 def a(self): print("これは1室0室のホールです",) # 这是一个一室零厅 def b(self): print("これは2室1室です") # 这是一个两室一厅 def c(self): print("これは3室2室です") # 这是一个三室两厅 people_a = demo_self() people_a.a() people_b = demo_self() people_b.b() people_c = demo_self() people_c.c()
执行以上代码后的结果如下:
开始运行... 図面に沿って家を建てている: これは1室0室のホールです 図面に沿って家を建てている: これは2室1室です 図面に沿って家を建てている: これは3室2室です 运行结束。
PS:针不戳啊,看了我的教程还学会了两句日语。什么?为什么要学日语?可不是我不爱国,是为了增加自己的技能,实在是不喜欢的话,下次用俄语也行。
我们来逐步分析代码,上面代码中,我们首先定义了一个类 demo_self, 然后定义了构造方法,接下来我们开始建造房子 a,b,c,当然我们可以建造很多个房子,每套房子都配备了一把钥匙 self ,每个钥匙指向了对应的房子,即每个 self 指向了对应的方法。当我们定义了每一位户主之后,户主选择了自己的房子,即 people_a 调用了房子 a(),其他户主也是同理。
概括起来就是:在未知对象的前提下,先定义属性和方法,用self指向他本身,再确定了对象之后,可以直接调用属性和方法。
另外一个例子就是,当我们开发出要开发一款软件时,我们不确定有哪些用户会使用,但是这款软件肯定需要存在,当用户想要使用这款软件之前,需要先注册并登录账号,才能正式使用这款软件。即:用户可以不存在,但是软件必须存在,用户存在后,可以自由使用软件。这样的例子在世界上还存在很多,即:万物皆对象!
另外,对于构造函数中的 self 参数,其代表的是当前正在初始化的类对象。举个例子:
class Person: name = "???" sex = "?" def __init__(self, name, sex): self.name = name self.sex = sex ly = Person("雷伊", "男") print(ly.name, ly.sex) gy = Person("盖亚", "女") print(gy.name, gy.sex)
运行结果为:
雷伊 男 盖亚 女
可以看到,ly 在进行初始化时,调用的构造函数中 self 代表的是 ly;而 gy 在进行初始化时,调用的构造函数中 self 代表的是 gy。
除了类对象可以直接调用类方法,还有一种函数调用的方式,例如:
class Persons: def who(self): print(self) people = Persons() # 第一种方式 people.who() # 第二种方式 who = people.who who() # 通过 who 变量调用people对象中的 who() 方法
运行结果为:
<__main__.Persons object at 0x7efe7bfcbd00> <__main__.Persons object at 0x7efe7bfcbd00>
显然,无论采用哪种方法,self 所表示的都是实际调用该方法的对象。
总之,无论是类中的构造函数还是普通的类方法,实际调用它们的谁,则第一个参数 self 就代表谁。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/105438.html