2008-10-01 56 views
6

我已经做了一些Python,但刚刚开始使用Ruby
我可以很好地解释这两种语言中“自我”的区别。Ruby和Python版本的“self”有什么区别?

乍一看很明显:
自我是不是一个Python关键字,但有一个“自我样”值,不管你们怎么称呼它。
Python方法接受自我作为显式参数,而Ruby不接受。
Ruby有时会使用点符号将方法显式定义为self的一部分。

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

+1

Python的版本是比较烦人:-) – 2008-10-02 00:07:42

+1

好了,我会说...它更存在。 :) – 2008-10-06 16:07:24

回答

7

Python旨在支持更多的不仅仅是面向对象的编程。保留方法和函数之间的相同接口可使两种样式更加干净地互操作。

Ruby从零开始构建为面向对象。即使文字是对象(评估1.class,你会得到Fixnum)。该语言的构建方式使得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 
5

好了,我不知道很多关于Ruby。但关于Python的“自我”的明显观点是它不是一个“关键字”......它只是发送给你的方法的参数的名称。

您可以使用您喜欢的任何名称作为参数。 “自我”只是一个惯例。

例如:

class X : 
    def __init__(a,val) : 
     a.x = val 
    def p(b) : 
     print b.x 

x = X(6) 
x.p() 

打印终端上的数字6。在构造函数中,自我对象实际上被称为a。但是在p()方法中,它被称为b。

更新:2008年10月,吉指出,有一个明确的自我也有必要让Python的装饰是一般足以纯函数,方法或classmethods工作:http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

+1

更好的是,由于方法只是类的可调用属性,因此您可以在类的外部定义`class X:pass`然后`def foo(b):print b.x`,并以`X.p = foo`结束。这很棒,因为你可以创建lambda表达式甚至闭包。示例用例:用于Django表单的动态`clean_foo`方法。 – Lloeki 2011-07-08 09:56:31

5

自我仅作为约定,您可以使用垃圾邮件,熏肉或香肠代替自己,并获得相同的结果。这只是传递给绑定方法的第一个参数。但坚持使用自己,因为它会混淆他人和一些编辑。

5

尽管webmat的要求,圭多wrote是明确的自我“不是一种实现破解 - 这是一个语义设备”。

原因在方法 定义签名明确的自我是语义 一致性。如果你写

C类:高清富(个体经营,X,Y):...

这确实一样写

C类:通过

高清FOO (self,x,y):... C.foo = foo

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

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

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