python的类方法为什么要写一个self参数
2014-11-07 17:20
459 查看
http://www.douban.com/group/topic/19376685/
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中几乎所有的东西的一级对象(一级对象的定义: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作为第一个参数?
- 为什么Java反射对象必须有一个无参数的构造方法?
- Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good
- Delphi函数指针的两种定义(对象方法存在一个隐藏参数self,所以不能相互赋值)
- 【Python】类的属性和方法的参数加不加self的区别
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- python @classmethod 和 @staticmethod区别,以及类中方法参数cls和self的区别
- python定义方法时传入参数中,参数名中带一个*与带两个*的意义
- 在java语言中为什么有时候构造方法有时要构造一个没有参数的方法
- Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
- 三篇文章,理解python类中的方法所需要的参数 self
- Access 至少一个参数没有被指定值 解决方法
- Spring AOP为什么不能拦截同一个对象内方法的嵌套调用(一)
- 如果java中一个方法不知道要传递多少参数也不知道传递过来的是什么类型的数据你会怎么做?
- 反射方法调用时的一个错误:参数计数不匹配( parameter count mismatch )
- 反射方法调用时的一个错误:参数计数不匹配( parameter count mismatch )
- python 参数列表中的self 显式不等于冗余
- 根据指定方法的参数去构造一个新的对象的拷贝并将他返回
- python中类中函数参数self