当你回归自我时会得到什么?

时间:2016-06-21 03:48:18

标签: python python-3.x

当你在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

3 个答案:

答案 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)

Partial Answer

返回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>

换句话说,xx.ret_self()都会返回对该类实例的相同引用。

self实际上是另一种说法&#34; Foo&#34;的实例。因此,类中的实例变量为self.a

你什么时候需要这个?我没有经验告诉你,我不想提供我不确定的误导性信息。我将把它留给别人解释这个答案。

请不要接受此答案。