python中的self,python函数 self

  python中的self,python函数 self

  对于类体中定义的实例方法,Python会自动绑定方法的第一个参数(通常建议将这个参数命名为self),第一个参数总是指向调用方法的对象。根据第一个参数出现的位置,第一个参数所绑定的对象略有不同:

  在构造函数中引用构造函数正在初始化的对象。

  在普通实例方法中引用调用此方法的对象。

  因为实例方法(包括构造函数)的第一个self参数是自动绑定的,所以程序在调用普通实例方法和构造函数时,不需要为第一个参数传递值。

  self参数(自动绑定的第一个参数)的作用是引用当前方法的调用者,比如前面介绍的构造方法中通过self给对象添加实例变量。您也可以在一个实例方法中访问另一个实例方法或该类的变量。假设定义了一个Dog类,这个Dog对象的run()方法需要调用它的jump()方法,那么可以通过self参数作为jump()方法的调用方。

  方法的第一个参数表示的对象是不确定的,但其类型是确定的,即只能表示当前类的实例;只有当这个方法被调用时,它所代表的对象才被确定。谁在调用这个方法,方法的第一个参数代表谁。

  例如,定义以下Dog类:

  classDog:

  #定义一个jump()方法

  defjump(self):

  打印(“执行跳转方法”)

  #定义一个run()方法,这需要jump()方法的帮助

  defrun(self):

  #使用self参数来引用调用run()方法的对象

  self.jump()

  上面print(执行run方法)代码的run()方法中的Self代表这个方法的调用者:谁在调用run()方法,那么self就代表谁。所以这个方法意味着当一个Dog对象调用run()方法时,run()方法需要依赖自己的jump()方法。

  Python对象的一个方法调用另一个方法时,不能省略self。也就是说,将上面的run()方法更改为以下形式是不正确的:

  #定义一个run()方法,这需要jump()方法的帮助

  defrun():

  #省略self,下面的代码将报告一个错误

  self.jump()

  Print (Running method )另外,在构造函数中,self参数(第一个参数)表示构造函数正在初始化的对象。例如,下面的代码:

  classInConstructor:

  def__init__(self):

  #在构造函数中定义一个foo变量(局部变量)。

  foo=0

  #使用self表示此构造函数正在初始化的对象。

  #下面的代码将此构造函数正在初始化的对象的foo实例变量设置为6。

  self.foo=6

  #用InConstructor创建的所有对象的foo实例变量将被设置为6。

  Print(InConstructor()。foo)#输出6在InConstructor中

   的构造方法中,self 参数总是引用该构造方法正在初始化的对象。程序中将正在执行初始化的 InConstructor 对象的 foo 实例变量设为 6,这意味着该构造方法返回的所有对象的 foo 实例变量都等于 6。

  需要说明的是,自动绑定的 self 参数并不依赖具体的调用方式,不管是以方法调用还是以函数调用的方式执行它,self 参数一样可以自动绑定。例如如下程序:

  

classUser:

  deftest(self):

  print('self参数:',self)

  

  u=User()

  #以方法形式调用test()方法

  u.test()#<__main__.Userobjectat0x00000000021F8240>

  #将User对象的test方法赋值给foo变量

  foo=u.test

  #通过foo变量(函数形式)调用test()方法。

  foo()#<__main__.Userobjectat0x00000000021F8240>

上面程序中第 5 行代码以方法形式调用 User 对象的 test() 方法,此时方法调用者当然会自动绑定到方法的第一个参数(self 参数);程序中第 11 行代码以函数形式调用 User 对象的 test() 方法,看上去此时没有调用者了,但程序依然会把实际调用者绑定到方法的第一个参数,因此输出结果完全相同。

  当 self 参数作为对象的默认引用时,程序可以像访问普通变量一样来访问这个 self 参数,甚至可以把 self 参数当成实例方法的返回值。看下面程序:

  

classReturnSelf:

  defgrow(self):

  ifhasattr(self,'age'):

  self.age+=1

  else:

  self.age=1

  #returnself返回调用该方法的对象

  returnself

  rs=ReturnSelf()

  #可以连续调用同一个方法

  rs.grow().grow().grow()

  print("rs的age属性值是:",rs.age)

从上面程序中可以看出,如果在某个方法中把 self 参数作为返回值,则可以多次连续调用同一个方法,从而使得代码更加简洁。但是这种把 self 参数作为返回值的方法可能会造成实际意义的模糊,例如上面的 grow 方法用于表示对象的生长,即 age 属性的值加 1,实际上不应该有返回值。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: