Ruby和Python中“self”的区别是什么?

6 投票
4 回答
1572 浏览
提问于 2025-04-11 09:29

我之前学过一些Python,现在刚开始接触Ruby。
我想要一个关于这两种语言中“self”的区别的好解释。

乍一看很明显:
在Python中,self不是一个关键字,但无论你怎么称呼,它都有一个“类似self”的值。
Python的方法会把self作为一个明确的参数传递,而Ruby则不是这样。
在Ruby中,有时候会用点符号明确地将某些方法定义为self的一部分。

初步搜索结果:
http://rubylearning.com/satishtalim/ruby_self.html
http://www.ibiblio.org/g2swap/byteofpython/read/self.html

4 个回答

5

在编程中,self只是一个约定俗成的写法,你可以用spam、bacon或者sausage来代替self,结果是一样的。它只是传递给绑定方法的第一个参数。不过,还是建议你使用self,因为这样会让别人更容易理解你的代码,也能避免一些编辑器的困惑。

6

尽管webmat说了什么,Guido曾经写过,明确使用self并不是一种技术上的小把戏,而是一种语义上的设计。

在方法定义中使用明确的self,是为了保持语义上的一致性。如果你写

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

这实际上和写

class C: pass

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

是一样的。

这是一个故意的设计决定,而不是后来才引入面向对象行为的结果。

在Python中,所有东西都是对象,包括字面量(比如数字和字符串)。

还可以看看为什么在方法定义和调用中必须明确使用'self'?

8

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

撰写回答