Ruby版本和Python版本的";“自我”吗;?

Ruby版本和Python版本的";“自我”吗;?,python,ruby,language-features,Python,Ruby,Language Features,我已经做了一些Python,但刚刚开始使用Ruby 我可以很好地解释这两种语言中“自我”的区别 乍一看很明显: Self在Python中不是一个关键字,但无论您如何称呼它,它都有一个“Self-like”值。 Python方法接受self作为显式参数,而Ruby则不接受。 Ruby有时将方法显式定义为self-using点表示法的一部分 首次谷歌搜索显示 嗯,我对Ruby了解不多。但是Python的“self”的一个明显特点是它不是一个“关键字”…它只是发送给方法的参数的名称 此参数可以使用任

我已经做了一些Python,但刚刚开始使用Ruby
我可以很好地解释这两种语言中“自我”的区别

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

首次谷歌搜索显示


嗯,我对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指出,有一个显式的self也是必要的,以使Python装饰器具有足够的通用性,能够处理纯函数、方法或类方法:

self仅用作约定,您可以使用spam、bacon或香肠代替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认为显式self“不是一种实现黑客——它是一种语义设备”

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

C类:def foo(自身、x、y):

这真的和写作一样

丙级:及格

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

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

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


另请参见

python版本更烦人:-)好吧,我想说。。。它更具代表性。:)对于这样一个事实上是错误的答案,应该怎么做?Python发布的第一个版本有一个完整的类系统。决定只编辑/纠正错误的部分,但是如果回答者能够避免发布一些很容易被维基百科否定的东西,那就太好了。哎哟!抢手货事实上,我不是Python开发人员,我应该在这里写一个免责声明。我回忆起大约两年前接受Guido van Rossum采访(在《弗洛斯周刊》上)时的情景。同样值得注意的是,Python中的文字与Ruby中的文字一样是完整的对象。评估(1).\uuuuu类\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。标记器(与对象系统无关)将“1.”视为浮点数,但使用括号或“1.uuu class_uuu”将按预期工作。更好的是,由于方法只是类的可调用属性,您可以定义
class X:pass
然后
def foo(b):print b.X
完全在类之外,并通过
X.p=foo
得出结论。这非常棒,因为您可以创建lambda甚至闭包之类的方法。示例用例:Django表单的动态
clean_foo
方法。