Ruby的class中定义以self.开头的方法有何不同

Python021

Ruby的class中定义以self.开头的方法有何不同,第1张

龟兔赛跑2015-02-15 01:26

一个ruby对象可以调用的方法有两类。

一类是定义于该对象的class中,叫instance method,比如

def last_updated_at

#blahblah

end

那么Category的实例便可以调用该方法,而Category本身不可以

这是对前面一个php程序员问python方法为什么要手写一个self的回答,当时那个帖非常的热闹,但是下面没有一个回复讲到要点,等我有空,已经找不到原帖了。

原因有多重。首先是python中几乎所有的东西的一级对象(一级对象的定义),method也不例外,比如你写一个:

class X:

def f(self, a, b):

...

那么可以这样引用f:

X.__dict__['f']

或者

X.f.__func__

现在问题来了,得到f以后怎么调用?f是一个方法,方法必须作用于对象。如果x是一个X对象,我们可以x.f(...),但是如果是以上面的方式得到的f呢?怎么f让作用于某个对象?最直观的方法就是和参数一起传递进去。

当然的限不同的设计也可以满足上面制。比如不要手写的self参数,增加this关键字,增加一个调用f个格式。这样的设计和pep20第二条不符合。

为理解python的self,不妨对比一下ruby和javascript。ruby的方式是方法不是一级对象,所以绕过了这个问题。javascript没有类,方法在调用时this会绑定到方法所属的对象,函数调用时this绑定到window,函数做构造器调用时this绑定到新对象。这么多规则,比Python复杂。