【问题标题】: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,并关注 this 和 this 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) 相同,方法通过a1 为self。
我说您引用的内容具有误导性的原因是它暗示__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。
如果我们调用rect的volume方法...
print rect.volume()
Python 会将对象rect 作为self 变量注入,并使用rects 的高度和宽度。由于我们调用了rect的volume方法,所以self指的是rect。
考虑用以下术语调用rect.volume() 可能会有所帮助:Rectangle.volume(rect)。
我相信作者试图解释self的机制,但可能有点混乱。