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

时间:2020-03-06 15:00:02  来源:igfitidea点击:

我已经做过一些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

解决方案

好吧,我对Ruby不太了解。但是关于Python的"自我"的显而易见的一点是,它不是"关键字"……它只是发送到方法的参数的名称。

我们可以为该参数使用任何我们喜欢的名称。 "自我"只是一个约定。

例如 :

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

x = X(6)
x.p()

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

更新:2008年10月,Guido指出拥有一个显式自我也是必要的,以使Python装饰器具有足够的通用性以处理纯函数,方法或者类方法:http://neopythonic.blogspot.com/2008/10/why -explicit-self-has-to-stay.html

self仅作为一种约定使用,我们可以使用垃圾邮件,培根或者香肠代替self,并获得相同的结果。这只是传递给绑定方法的第一个参数。但是请坚持使用自我,因为这会使其他人和一些编辑者感到困惑。

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

尽管有webmat的主张,但Guido写道,显式的自我"不是实现黑客-它是语义设备"。

The reason for explicit self in method
  definition signatures is semantic
  consistency. If you write
  
  class C: def foo(self, x, y): ...
  
  This really is the same as writing
  
  class C: pass
  
  def foo(self, x, y): ... C.foo = foo

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

Python -isan对象中的所有内容,包括文字。

另请参见为什么必须在方法定义和调用中显式使用'self'?