为什么类中的所有方法必须指定一个默认的参数 self 作为第一个参数

sure2003 2011-09-21 02:44:42
十分不解。
...全文
674 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fnoodles 2011-10-08
  • 打赏
  • 举报
回复
这个问题我还是可以回答下的:
你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,
arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1,
arg2)——这就是self的原理了。

-----引用自《简易Python教程》
jiandingzhe 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sure2003 的回复:]

那既然C++隐藏了没有问题,PYTHON何必一定要显示出来。
[/Quote]
因为它懒得隐藏。perl也这样。
iEverX 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fibbery 的回复:]
换句话说,在面向对象的程序中,类方法的调用,语法形式上,
将method(obj,...) 演化成了 obj.method(...),但,obj仍然是method的参数,而且是第一个,该实参由形参self来接受,并在method内部使用,作为引用obj的成员变量的媒介。
[/Quote]
初学者最容易的理解
frank_29 2011-09-29
  • 打赏
  • 举报
回复
只是设计者的习惯而已,可能他认为明确写出来更容易理解。究竟是好还是不好,就各自有各自说法了。
BestTim 2011-09-29
  • 打赏
  • 举报
回复
这只是一个习惯、惯例,犹如其他语言隐藏了this、self一样
www_adintr_com 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sure2003 的回复:]

那既然C++隐藏了没有问题,PYTHON何必一定要显示出来。
[/Quote]

C++ 隐藏了的代价就是类变量名经常和函数参数或局部变量重名, 尤其是构造函数里面. 所以 C++ 的成员变量一般都要加 _, m_ 之类的前缀来做区分.
而 Python 的设计思想就是明确, 不搞隐晦的东西. 对象的变量就通过 self.name 来引用,局部变量就直接引用, 一目了然.

另外 C++ 隐藏 this 参数还是因为它的 this 参数不一定是通过堆栈传过去的, VC 就用寄存器来传 this, 堆栈来传函数的参数, 不能像 python 那样直接把 this 当做第一个参数.
sure2003 2011-09-22
  • 打赏
  • 举报
回复
那既然C++隐藏了没有问题,PYTHON何必一定要显示出来。
widlisyx 2011-09-22
  • 打赏
  • 举报
回复
c++中隐藏了该变量,python没这么做,不需要特别在意这个
prince2605 2011-09-22
  • 打赏
  • 举报
回复
就好像很多语言类里面的this指针,方便指回类里面的属性啊方法之类的。
zengna_com 2011-09-22
  • 打赏
  • 举报
回复
表示该方法是类的成员函数,method(self)跟定义变量self.var 是一样的道理
fibbery 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sure2003 的回复:]
那既然C++隐藏了没有问题,PYTHON何必一定要显示出来。
[/Quote]

这就是语法。就像我们学英语说英语一定要按照英语的习惯而不能按照汉语的习惯一样。
wangjiepro 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sure2003 的回复:]

那既然C++隐藏了没有问题,PYTHON何必一定要显示出来。
[/Quote]

http://blog.sina.com.cn/s/blog_6a75d4fc0100vxnf.html
wangjiepro 2011-09-21
  • 打赏
  • 举报
回复

class Test:
def PrintTest(self):
print(self.name)

t = Test()
t.name = 'aaa'
Test.PrintTest(t) #aaa
t.PrintTest() #aaa


和C++的对比一下,理会理会
iambic 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sure2003 的回复:]
好深奥。有没能 简单的说法。
[/Quote]

你自己试着在python的基础上把self去掉,就知道为什么要这样设计了。如果你觉得没问题,就把你修改过后的代码贴出来讨论。只有这样你才能亲身体会到一样东西为什么是这样设计的。
fibbery 2011-09-21
  • 打赏
  • 举报
回复
换句话说,在面向对象的程序中,类方法的调用,语法形式上,
将method(obj,...) 演化成了 obj.method(...),但,obj仍然是method的参数,而且是第一个,该实参由形参self来接受,并在method内部使用,作为引用obj的成员变量的媒介。
fibbery 2011-09-21
  • 打赏
  • 举报
回复
简单的说,当你在通过对象调用方法的时候,形如:
obj.method();
obj怎样在调用中体现?obj恰恰使用了self参数来传递到method内部,method内部通过self来使用obj的成员,也就是说,在method内部的成员实际上被扩展为self.property,这样,我们的属性和方法才能够针对具体的类的对象来使用。

也正因为如此,我们必须找到一种方法将实际的对象传递到类方法中去,即,self,C++中叫this指针。
sure2003 2011-09-21
  • 打赏
  • 举报
回复
好深奥。有没能 简单的说法。
iambic 2011-09-21
  • 打赏
  • 举报
回复
这是python用来引用成员变量的一种方式。可以看成是语言设计的风格。
好处是作用域更加简单明了。否则,你需要区别一个成员函数里引用的一个名字,是全局变量,还是局部变量,还是对象的一个属性。再加上对象的属性又可能是动态的,这就会有各种各样的歧义与麻烦。

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧