【问题标题】:self refers to the newly created object; in other class methods, it refers to the instance whose method was called.?self 指的是新创建的对象;在其他类方法中,它指的是调用其方法的实例。?
【发布时间】:2016-11-02 23:35:11
【问题描述】:

我正在学习 Python 中的 OOP,并关注 thisthis stackoverflow 答案和 this post

作者在博文中解释了这一点:

init方法中,self指的是新创建的对象;在 其他类方法,它指的是其方法的实例 调用。

我理解了这一行的第一部分,但无法理解这一行的第二部分

"在其他类方法中,它指的是其方法所在的实例 调用。”

第二行是什么意思?有人可以用expample解释一下吗?

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    您引用的文字充其量是令人困惑和误导的。但这里是一个例子。

    class A(object):
        def p(self):
           print(self)
    
     a1 = A()        # create two instances
     a2 = A()
     a1.p()          # calls A.p(a1); self is a1
     a2.p()          # calls A.p(a2); self is a2
    

    第二句的意思是self 是对您正在调用方法的对象的引用:. 之前的对象。 a1.p()A.p(a1) 相同,方法通过a1self

    我说您引用的内容具有误导性的原因是它暗示__init__() 与其他方法不同。它不是。 __init__() 是一种与其他方法一样的方法。它会自动传递要操作的实例作为其第一个参数。只是在调用__init__() 时它还没有名字,因为它在初始化之前没有名字。但self 仍然是实例。

    真正不同的是__new__(),但你可能暂时不需要它,如果有的话。

    【讨论】:

      【解决方案2】:

      假设你做了一个类:

      class Rectangle():
          def __init__(self, height, width):
              self.height = height
              self.width = width
      
          def volume(self):
              return self.height * self.width
      

      他们说的并不多,只是听起来令人困惑。

      假设我们制作了一个新的 Rectangle:

      rect = Rectangle(5, 4)

      在这种情况下,self 指的是新创建的 Rectangle rect

      如果我们调用rectvolume方法...

      print rect.volume()

      Python 会将对象rect 作为self 变量注入,并使用rects 的高度和宽度。由于我们调用了rectvolume方法,所以self指的是rect

      考虑用以下术语调用rect.volume() 可能会有所帮助:Rectangle.volume(rect)

      我相信作者试图解释self的机制,但可能有点混乱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2013-01-12
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多