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

What is the difference between Ruby and Python versions of"self"?

提问人:John Mulder 提问时间:10/2/2008 最后编辑:John Mulder 更新时间:10/28/2008 访问量:1559

问:

我做过一些 Python,但现在才开始使用 Ruby
,我可以很好地解释这两种语言中“self”之间的区别。

乍一看很明显:
Self 在 Python 中不是一个关键字,但无论你怎么称呼它,都有一个“self-like”值。
Python 方法将 self 作为显式参数接收,而 Ruby 则不然。 Ruby 有时会使用点表示法将方法显式定义为 self 的一部分。

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

Python Ruby 语言特性

评论

1赞 Orion Edwards 10/2/2008
python版本更烦人:-)
1赞 John Mulder 10/7/2008
好吧,我会说......它更存在。:)

答:

5赞 interstar 10/2/2008 #1

好吧,我对 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

评论

1赞 Lloeki 7/8/2011
更好的是,由于方法只是一个类的可调用属性,因此您可以完全在类之外定义,并用 .这太棒了,因为您可以将方法创建为 lambda 甚至闭包。示例用例:Django 表单的动态方法。class X: passdef foo(b): print b.xX.p = fooclean_foo
5赞 Vasil 10/2/2008 #2

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

8赞 webmat 10/2/2008 #3

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

评论

0赞 John Millikin 10/3/2008
对于像这样事实上错误的答案,应该怎么做?发布的第一个 Python 版本有一个完整的类系统。
0赞 John Millikin 10/3/2008
决定只编辑/更正错误部分,但如果回答者不要发布一眼维基百科就容易反驳的内容,那就太好了。
0赞 webmat 10/8/2008
哎哟!好渔获。我实际上不是 Python 开发人员,我应该在那里放一个免责声明。我从大约 2 年前对 Guido van Rossum 的一次采访中(在 FLOSS 周刊上)的记忆中消失了
7赞 Brian 10/10/2008
还值得注意的是,Python 中的文字是完整的对象,就像在 Ruby 中一样。计算 (1).__class__ 可以<键入 'int'>。将“1.”视为浮点数的分词器(与对象系统无关)存在差异,但使用括号或“1 .__class__”将按预期工作。
6赞 Matthew Trevor 10/3/2008 #4

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

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

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

这真的和写作是一样的

C类:及格

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

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

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

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