提问人:John Mulder 提问时间:10/2/2008 最后编辑:John Mulder 更新时间:10/28/2008 访问量:1559
“self”的 Ruby 和 Python 版本有什么区别?
What is the difference between Ruby and Python versions of"self"?
问:
我做过一些 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
答:
好吧,我对 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
评论
class X: pass
def foo(b): print b.x
X.p = foo
clean_foo
self 仅用作约定,您可以使用垃圾邮件、培根或香肠代替 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 写道,显式自我“不是一个实现黑客——它是一种语义设备”。
方法中显式自我的原因 定义签名是语义的 一致性。如果你写
C 类:def foo(self, x, y): ...
这真的和写作是一样的
C类:及格
def foo(self, x, y): ...C.foo = 福
这是一个有意的设计决策,而不是在后来引入OO行为的结果。
Python 中的所有内容都是一个对象,包括文字。
评论