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

Joh*_*der 6 ruby python language-features

我已经做了一些Python但刚刚开始使用Ruby
我可以使用这两种语言中"self"之间差异的一个很好的解释.

乍看之下显而易见:
Self不是Python中的关键词,但无论你怎么称呼它都有一个"自我喜欢"的价值.
Python方法接受self作为显式参数,而Ruby则不接受.
Ruby有时使用点表示法将方法明确定义为self的一部分.

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

web*_*mat 7

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
Run Code Online (Sandbox Code Playgroud)

在课程定义时,将打印"我是C".

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

c=C.new

c.instance_method
#=> instance_method
C.class_method
#=> class_method
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,Python中的文字就像Ruby中的完整对象一样.评估(1).__ class__会让你<type'int'>.处理"1"的标记化器(与对象系统无关)存在差异.作为一个浮点数,但使用括号,或"1 .__ class__"将按预期工作. (7认同)

Mat*_*vor 6

尽管网络公司声称,Guido 写道,明确的自我"不是实施黑客 - 它是一种语义设备".

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

C类:def foo(self,x,y):...

这确实一样的书写

C级:通过

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

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

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

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


int*_*tar 5

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

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

例如 :

class X :
    def __init__(a,val) :
        a.x = val
    def p(b) :
        print b.x

x = X(6)
x.p()
Run Code Online (Sandbox Code Playgroud)

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

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


Vas*_*sil 5

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