class ABC:
def xyz(self):
print "in xyz"
obj = ABC()
print obj.xyz()
输出:in xyz
self
调用xyz
时,此处obj
未作为参数提供。
答案 0 :(得分:4)
这是因为self
默认情况下是实例本身。 obj.xyz()
相当于ABC.xyz(obj)
。
答案 1 :(得分:1)
每个类方法的第一个参数,包括__init__
,始终是对类的当前实例的引用。
按照惯例,此参数始终命名为self
。
在__init__
方法中,self引用新创建的对象;在其他实例方法中,它指的是调用其方法的实例。虽然在定义方法时需要明确指定self
,但在调用方法时不要指定它; Python会自动为你添加它。
答案 2 :(得分:0)
从技术上讲,这就是:
obj.xyz
obj
没有名为xyz
obj
的类(ABC
)中查找名为xyz
的属性,它具有ABC.xyz
是一个函数,因此它将它“包装”成“实例方法”。基本上,ABC.xyz
是一个带有一个参数(self
)的函数,因此“实例方法”是一个函数,其中原始函数的参数少一个(在这种情况下没有参数),它记住了对象obj
。如果你调用这个“实例方法”,它会将它传递给ABC.xyz
,第一个参数为obj
,其余参数是绑定方法的参数。obj.xyz
评估此实例方法ABC.xyz
)作为第一个参数,调用此实例方法调用obj
。以下是语言参考的相关部分(从here滚动):
类实例
通过调用类对象来创建类实例(参见上文)。类实例有一个名称实现为字典的名称空间 搜索属性引用的第一个位置。当一个 在那里找不到属性,并且实例的类有一个 通过该名称的属性,搜索继续该类 属性。如果找到属性是用户定义的类属性 函数对象,它被转换为实例方法对象 其
__self__
属性是实例。 [...]
和
实例方法
[...]
通过检索用户定义的方法创建实例方法对象时 一个类通过其实例之一的
__self__
函数对象 attribute是实例,并且方法对象被称为绑定。 新方法的__func__
属性是原始函数对象。[...]
调用实例方法对象时,底层函数 调用(
__func__
),插入类实例(__self__
) 参数列表的前面。例如,当C
是一个类时 包含函数f()
的定义,x
是函数的实例C
,调用x.f(1)
相当于调用C.f(x, 1)
。[...]