python self太多_大家是如何理解Python中的self?

首先,如果你和我一样,在学Python的时候对self百思不得其解,甚至冥思苦想一下午,想到最后只剩一句吐槽“MMP我要是作者我肯定把这劳什子删掉!”。

那恭喜你,你思考了一个很有价值的问题。

其实早在十几年前就有人给Python之父Guido van Rossum提过建议,让Guido把self删掉:https://www.artima.com/forums/flat.jsp?forum=106&thread=239003​www.artima.com

Guido特意写了篇博客,说self还是有存在必要的:http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html​neopythonic.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.名字 = 王思葱

但假如,有个不识趣的泥人问投胎炉:什么名字?

少了个“我”(没把自己当成参数传给函数),投胎炉就搞不懂你到底要问它什么。

有可能它会建议你回炉重造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值