【问题标题】:What is the difference between Ruby and Python versions of"self"?Ruby 和 Python 版本的“self”有什么区别?
【发布时间】:2010-09-14 16:05:57
【问题描述】:

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

【问题讨论】:

  • python版本比较烦:-)
  • 好吧,我想说...它更存在。 :)

标签: python ruby language-features


【解决方案1】:

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

【讨论】:

  • 这样的答案实际上是错误的应该怎么办?发布的第一个 Python 版本有一个完整的类系统。
  • 决定只编辑掉/纠正错误的部分,但如果回答者不要发布容易通过维基百科一目了然的东西,那就太好了。
  • 哎哟!接得好。我实际上不是 Python 开发人员,我应该在里面放一个免责声明。大约 2 年前,我从记忆中回忆起 Guido van Rossum(在 FLOSS Weekly 上)
  • 另外值得注意的是,Python 中的文字是完整的对象,就像在 Ruby 中一样。评估 (1).__class__ 得到 。处理“1”的标记器(与对象系统无关)有所不同。作为浮点数,但使用括号或“1 .__class__”将按预期工作。
【解决方案2】:

尽管 webmat 声称,Guido wrote 明确的自我“不是实现黑客——它是一种语义设备”。

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

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

这真的和写一样

C 类:通过

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

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

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

另见Why must 'self' be used explicitly in method definitions and calls?

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 更好的是,由于方法只是类的可调用属性,您可以完全在类之外定义class X: pass 然后def foo(b): print b.x,最后以X.p = foo 结束。这太棒了,因为您可以将方法创建为 lambda 甚至闭包。示例用例:Django 表单的动态 clean_foo 方法。
      猜你喜欢
      • 1970-01-01
      • 2016-02-24
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多