首先,如果你和我一样,在学Python的时候对self百思不得其解,甚至冥思苦想一下午,想到最后只剩一句吐槽“MMP我要是作者我肯定把这劳什子删掉!”。
那恭喜你,你思考了一个很有价值的问题。
其实早在十几年前就有人给Python之父Guido van Rossum提过建议,让Guido把self删掉:https://www.artima.com/forums/flat.jsp?forum=106&thread=239003www.artima.com
Guido特意写了篇博客,说self还是有存在必要的:http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.htmlneopythonic.blogspot.com
既然Guido都这么说了,那就接受呗。
毕竟Guido在设计类的时候就把规矩定死了:Class variables are variables that are being shared with all instances (objects)
所以self与现在的Python而言是不得不存在的东西。
为方便你理解self的用处,我来打个比方。
假设你是女娲。
现在你绳子甩累了,你觉得这样造人的方式效率太低。
所以你就造出了一台“投胎炉”(Class,创建类)。
Class 人牌投胎炉:
只要泥人排着队跳进投胎炉,泥人就能自动变人类。
作为女娲,你还要给这台投胎炉设立使用规则。
所以你想了一会儿,做出如下决定:
投胎炉的使用方法很简单,
跳的时候喊个名字,你来世就叫什么名字。
比方说,泥人A“卟咚”一声跳进投胎炉,边跳边喊,
“张三!”
那投胎炉就会自动把这句话理解成:泥人A来世要叫张三。
class 人牌投胎炉:
def 取名规则(‘张三’):
泥人A的名字: 张三
就这个小泥人,就能投胎变成有血有肉,且名字叫“张三”的人。
泥人B跳的时候大喊,
“王思葱!”
那B就能投胎做王思葱。
class 人牌投胎炉:
def 取名规则(泥人B来世要叫‘王思葱’):
泥人B的名字: 王思葱
投胎炉会默默把所有泥人,和它喊的名字绑在一起(Bind,绑定)。
泥人A.名字: 张三
泥人B.名字: 王思葱
...
泥人N.名字: xxx
(当然真实情况可能是,泥人在跳之前喊“名字张三,家住北京,身高一米七,长相过得去……”,先喊两个小时,才能往下跳……)
哇,太方便了,规则设立好,这™就是个造人工厂。
于是作为女娲,你就可以休假了,让投胎炉全自动运作。
现在,泥人A跳了投胎炉后出生了(Instance,实例化),它要取名字。
此时它若会问投胎炉:我叫什么?(我,就是self)
投胎炉就会把“我”给理解成“泥人A”。
然后把泥人A和它跳炉时候喊的“张三”对应起来。
然后把名字返还给它。
泥人A.名字 = 张三
泥人B同理,问我叫什么?
投胎炉就会把“王思葱”返还给它。
泥人B.名字 = 王思葱
但假如,有个不识趣的泥人问投胎炉:什么名字?
少了个“我”(没把自己当成参数传给函数),投胎炉就搞不懂你到底要问它什么。
有可能它会建议你回炉重造。