Ruby和Python版本的“self”有什么区别?

我已经完成了一些Python,但刚刚开始使用Ruby
我可以很好地解释这两种语言中“自我”的区别。

乍一看很明显:
Self不是Python中的关键字,但无论你怎么称呼它都有一个“自我喜欢”的价值。
Python方法将self视为显式参数,而Ruby则不然。
Ruby有时使用点表示法将方法明确定义为self的一部分。

最初的谷歌搜索显示
http://rubylearning.com/satishtalim/ruby_self.html
http://www.ibiblio.org/g2swap/byteofpython/read/self.html

Python旨在支持不仅仅是面向对象的编程。 保留方法和函数之间的相同接口可以使两种样式更干净地互操作。

Ruby是从头开始构建的,面向对象。 甚至文字都是对象(评估1.class,你得到Fixnum)。 构建语言使self成为保留关键字,无论您身在何处都返回当前实例。

如果你在一个类的实例方法中,self就是对所述实例的引用。

如果你在类本身的定义中(不在方法中),self就是类本身:

class C puts "I am a #{self}" def instance_method puts 'instance_method' end def self.class_method puts 'class_method' end end 

在课程定义时,将打印“我是C”。

直接’def’定义了一个实例方法,而’def self.xxx’定义了一个类方法。

 c=C.new c.instance_method #=> instance_method C.class_method #=> class_method 

self仅作为惯例使用,您可以使用垃圾邮件,培根或香肠代替自己,并获得相同的结果。 它只是传递给绑定方法的第一个参数。 但坚持使用自我,因为它会混淆他人和一些编辑。

尽管网络媒体声称,Guido 写道 ,明确的自我“不是实施黑客 – 它是一种语义设备”。

在方法定义签名中显式自我的原因是语义一致性。 如果你写

C级:def foo(self,x,y):…

这与写作完全一样

C级:通过

def foo(self,x,y):… C.foo = foo

这是一个有意的设计决定,而不是在后一天引入OO行为的结果。

Python中的所有东西都是一个对象,包括文字。

另请参阅为什么必须在方法定义和调用中明确使用“self”?

好吧,我对Ruby不太了解。 但是关于Python“自我”的明显之处在于它不是一个“关键字”……它只是发送给你的方法的参数的名称。

您可以为此参数使用您喜欢的任何名称。 “自我”只是一种惯例。

例如 :

 class X : def __init__(a,val) : ax = val def p(b) : print bx x = X(6) xp() 

打印终端上的数字6。 在构造函数中,self对象实际上称为a。 但是在p()方法中,它被称为b。

更新:2008年10月,Guido指出,拥有一个明确的自我也是必要的,以允许Python装饰器足够通用,可以处理纯函数,方法或类方法: http : //neopythonic.blogspot.com/2008/10/why -explicit自具有对stay.html