虽然我现在写过一些Python代码,但实际上几乎还没用过Class,而且一直觉得一个很别扭的事情是,Class中的函数都要写个参数self,虽然实例化调用的时候不需要。
当然,一开始就知道Python这样设计应该有它的理由,具体是什么也没去考虑。
今天看到一个这样的说法:
源地址:http://www.douban.com/group/topic/19376685/
我解释一下python的类方法为什么要写一个self参数
来自: 巴特富莱韦杭普(Butterfly Wet-hamp) 2011-04-26 23:18:19
这是对前面一个php程序员问python方法为什么要手写一个self的回答,当时那个帖非常的热闹,但是下面没有一个回复讲到要点,等我有空,已经找不到原帖了。
原因有多重。首先是python中几乎所有的东西的一级对象(一级对象的定义:http://en.wikipedia.org/wiki/First-class_object),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复杂。
虽然基本上算是理解了Python为什么要加这个self。但是!!!我必须想明白这个但是!!!我之所以喜欢Python,就是因为它的简洁,我之前的理解是:
用最少的工作做最多的事情
繁琐的工作没必要做
出来的结果跟想象的结果惊人的一致
正因为这样,所以,我实在是无法理解这个self,无论从哪方面考虑,它都是多余的,既然连{}这种东西都能省,为什么一个self不能省?!纵使PEP 20哲学说清晰好过模糊,但为什么还支持带缺省值的参数,为什么不像C语言那样不能省略?
所以,无论是从Python设计哲学还是设计技术细节来考虑,这个self真的是一个很奇怪的东西,再怎么说,前面已经有个class了,这一段就是类啊!!!