当你在python类中返回'self'时返回什么?我们在哪里使用返回'self'?在下面的例子中,self会返回什么
class Fib:
'''iterator that yields numbers in the Fibonacci sequence'''
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def __next__(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
print(self.a,self.b,self.c)
return fib
答案 0 :(得分:1)
关键字self
用于指代您从该方法调用该方法的实例。
这对chaining特别有用。在您的示例中,我们要说我们要在初始化的__next__()
实例上调用Fib
。由于__iter__()
返回self
,因此以下内容相同:
obj = Fib(5)
obj.__iter__() # Initialize obj
obj.__next__()
和
obj = Fib(5).__iter__() # Create AND initialize obj
obj.__next__()
在您的特定示例中,self
关键字会返回您正在调用Fib
的{{1}}类的实例(在我的小代码段中称为__iter__()
)。< / p>
希望它会有所帮助。
答案 1 :(得分:1)
Python将类似object.method()
的方法调用视为method(object)
。 The docs说“来电x.f()
完全等同于MyClass.f(x)
”。这意味着方法将接收对象作为第一个参数。按照惯例,在方法的定义中,第一个参数称为self
。
所以self
是拥有该方法的对象的传统名称。
现在,我们为什么要返回self
?在您的特定示例中,这是因为该对象实现了iterator protocol,这基本上意味着它具有__iter__
和__next__
方法。 __iter__
方法必须(根据文档)“返回迭代器对象本身”,这正是这里发生的事情。
另外,返回self
的另一个常见原因是支持method chaining,您希望在object.method1().method2().method3()
中执行所有这些方法在同一个类中定义的{{1}}。这种模式在像熊猫这样的库中很常见。
答案 2 :(得分:0)
返回self
时,返回类实例。例如:
class Foo:
def __init__(self, a):
self.a = a
def ret_self(self):
return self
如果我创建一个实例并运行ret_self
,您会发现它们都引用了同一个实例:
>>> x = Foo("a")
>>> x
<__main__.Foo instance at 0x0000000002823D48>
>>> x.ret_self()
<__main__.Foo instance at 0x0000000002823D48>
换句话说,x
和x.ret_self()
都会返回对该类实例的相同引用。
self
实际上是另一种说法&#34; Foo
&#34;的实例。因此,类中的实例变量为self.a
。
你什么时候需要这个?我没有经验告诉你,我不想提供我不确定的误导性信息。我将把它留给别人解释这个答案。
请不要接受此答案。