如果我们在python中的类中创建任何方法,我们总是使用self作为第一个参数,但是在调用该方法时我们不会通过?为什么?

时间:2014-12-04 12:45:36

标签: python self

class ABC:
    def xyz(self):
        print "in xyz"

obj = ABC()
print obj.xyz()

输出:in xyz

使用self调用xyz时,

此处obj未作为参数提供。

3 个答案:

答案 0 :(得分:4)

这是因为self默认情况下是实例本身obj.xyz()相当于ABC.xyz(obj)

答案 1 :(得分:1)

每个类方法的第一个参数,包括__init__,始终是对类的当前实例的引用。

按照惯例,此参数始终命名为self

__init__方法中,self引用新创建的对象;在其他实例方法中,它指的是调用其方法的实例。虽然在定义方法时需要明确指定self,但在调用方法时不要指定它; Python会自动为你添加它。

详细了解self herehere

答案 2 :(得分:0)

从技术上讲,这就是:

  1. 它会尝试评估obj.xyz
  2. 它资助对象obj没有名为xyz
  3. 的属性
  4. 然后在obj的类(ABC)中查找名为xyz的属性,它具有
  5. ABC.xyz是一个函数,因此它将它“包装”成“实例方法”。基本上,ABC.xyz是一个带有一个参数(self)的函数,因此“实例方法”是一个函数,其中原始函数的参数少一个(在这种情况下没有参数),它记住了对象obj。如果你调用这个“实例方法”,它会将它传递给ABC.xyz,第一个参数为obj,其余参数是绑定方法的参数。
  6. obj.xyz评估此实例方法
  7. 您使用记住的实例(ABC.xyz)作为第一个参数,调用此实例方法调用obj
  8. 以下是语言参考的相关部分(从here滚动):

      

    类实例

         

    通过调用类对象来创建类实例(参见上文)。类实例有一个名称实现为字典的名称空间   搜索属性引用的第一个位置。当一个   在那里找不到属性,并且实例的类有一个   通过该名称的属性,搜索继续该类   属性。如果找到属性是用户定义的类属性   函数对象,它被转换为实例方法对象   其__self__属性是实例。 [...]

      

    实例方法

         

    [...]

         

    通过检索用户定义的方法创建实例方法对象时   一个类通过其实例之一的__self__函数对象   attribute是实例,并且方法对象被称为绑定。   新方法的__func__属性是原始函数对象。

         

    [...]

         

    调用实例方法对象时,底层函数   调用(__func__),插入类实例(__self__)   参数列表的前面。例如,当C是一个类时   包含函数f()的定义,x是函数的实例   C,调用x.f(1)相当于调用C.f(x, 1)

         

    [...]