其实我是自己很想回答这个问题,可惜别人的问题closed 了,只好自问自答。
self 指的是 this,
但更重要的是,摆在 function 宣告里的 self 又作何解释呢?
就是把该 function 宣告为 物件函数 的意思,
如果,function 的参数中没有 self ,那就是静态函数(或称类别函数),
可直接透过类别名呼叫,但,例如,class A 中的 函数 f1,呼叫方式即为 A.f1,
但,要注意的是,类别函数内,无法使用 物件变数,
如果硬要的话,可以在类别函数的参数内多加一个型别为A 的参数,
这是在你不想用 self,但又要一定要用成员变数时,的变通方式。相当於放屁时,不想屁弄到裤子,
简单说明一下,我对 成员函数 的小小感想,
事实上,一开始,函数就像 C 里头的函数一样单纯自然的,
怎麼说单纯自然呢?看到几个参数就是几个参数,
你可以想像,编译器在分配储存空间时,编译一个有三个int 参数并传回int的函数时,会保留四个4 bytes的空间(也就是 16 bytes),分别让函数被呼叫时,可以接收三个int ,而在函数执行完时,会将会传回的 int,写到 第4个 int 上(理论上应该是第一个,无所谓啦),
到了,物件导向的程式语言里,基本上,类别函数也是这个样子处理的,所以,没学过物件导向的人,或觉得物件导向麻烦的人,但又一定要用物件导向程式语言时,就通通用 类别函数就好,只有一点小麻烦,每个函数除了它的名字,还有 它的 "姓" (就是它 所属类别 的名字),要记得加上去。(事实上,这样很方便管理 函数,要知道,当你程式写多了,写大了,最麻烦的事,就是 取名字,有类别名,就能重覆用名字了)
再说回,物件函数,当初设计 物件导向程式语言 的人,弄了个花招,他想说要让用的人感受到这种程式语言 的"亮点" ,所以,帮这种 函数 偷偷的在暗地里多加了一个 参数,叫做 this (或者你要说 self 也行),简单的说,如果一个 三个 int 参数 并回传 int 的函数,呼叫它的储存空间,就会变成 20 bytes(以32位元程式来说), 其中,一样是 12 bytes 给 传入参数,4bytes 给回传用,另外多了 4 bytes,则是用来传入一个参考位址(或者说是一个 pointer),指向 某个 本类别的物件,
还记得吗?类别只是收录在编译器的脚本,告诉编译器初始一个该类变数或说是物件时,要给几个bytes,还有各成员变数的 偏移位址 多少,各函数呼叫位址多少等等的,所以,类别内宣告的变数,基本上在程式执行时,是不存在於记忆体,只有当 程式里 有该类变数 被初始化时,才会配置实体记忆体空间。
既然,类别是不存在的虚拟范本,它就无法叫用 物件函数,只有透过物件初始化,得到实体记忆体空间配置的物件,因为具有 实体位址,因此,可以呼叫物件函数,而呼叫时,它的位址就会被填到那个 this (或 self)的参数里,大部份的物件导向程式语言都隐藏了这个参数, python 只是把它突显出来给你看,但相对来讲,你不用对 类别函数 宣告 static 。
这样不晓得解释的OK 不OK耶!
由於,我才刚始用 python(两个礼拜前吧),如果说的有问题,请大家指正,感谢!
首先,self 和 this 不是一回事
self 不是关键字,只是约定,可以是任意变量名
为啥要有self呢,想想python是的变量定义方式就明白了;
python无需声明对象,可以在任意地方开始定义或初始化一个变量;
python中变量的作用域只有两种:global和local
这就有个问题了,
class C():
def foo(a,b,c):
x=123 # 在这里出现的x,被当作一个局部变量,怎样让它绑定到对象的实例上去?
在C++或JAVA中,看的是x是在哪里声明的,如果是类里面声明的,这里相当于有个隐形的this,x就相当于是this.x,可以直接用
而在python中,没有这个this,而是在通过对象调用foo的时候,obj.foo ,总是将obj默认作为 第一个 入参 传入,(对于这个foo,就是传给了a),用户只需要再指定剩余的入参即可。
本回答被网友采纳