6

我已经完成了一些 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

4

4 回答 4

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

在类定义时,将打印“I am a C”。

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

c=C.new

c.instance_method
#=> instance_method
C.class_method
#=> class_method
于 2008-10-01T23:32:01.760 回答
6

尽管 webmat 声称,Guido写道,显式自我“不是实现黑客——它是一种语义设备”。

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

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

这真的和写一样

C类:通过

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

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

Python 中的一切都是对象,包括文字。

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

于 2008-10-03T03:24:23.190 回答
5

好吧,我对 Ruby 了解不多。但是关于 Python 的“self”的明显一点是它不是一个“关键字”......它只是一个发送到你的方法的参数的名称。

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

例如 :

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 装饰器足够通用以处理纯函数、方法或类方法,还需要有一个显式的 self:http: //neopythonic.blogspot.com/2008/10/why -explicit-self-has-to-stay.html

于 2008-10-01T22:16:33.237 回答
5

self 仅用作约定,您可以使用 spam、bacon 或 sausage 代替 self 并获得相同的结果。这只是传递给绑定方法的第一个参数。但坚持使用 self ,因为它会混淆其他人和一些编辑。

于 2008-10-01T22:34:42.850 回答