回归"自我"?它究竟做了什么,何时需要回归自我

时间:2018-05-30 06:05:15

标签: python python-3.x contextmanager

我遇到了类似于此的代码:

from contextlib import contextmanager, ContextDecorator

class makepara(ContextDecorator):
     def __enter__(self):
        print ("<p>")
        return self

     def __exit__(self, *args):
         print ("</p>")
         return False

@makepara()
def emit_data():
    print (" here is HTML code")

    emit_data()

我找到了相关答案this 但是当我将上面的代码更改为

from contextlib import contextmanager, ContextDecorator

class makepara(ContextDecorator):
    def __enter__(self):
        print ("<p>")

    def __exit__(self, *args):
        print ("</p>")

@makepara()
def emit_data():
    print (" here is HTML code")

emit_data()

输出没有变化,这让我想知道return self实际上做了什么以及如何使用?

2 个答案:

答案 0 :(得分:4)

您选择返回self(或其他一些对象,但通常是上下文管理器实例self),以便可以使用以下语法绑定名称:

with makepara() as var:
    ...

__enter__返回的对象将绑定到上下文中的名称var(实际上,在退出上下文后将保持绑定到var。)

如果在输入上下文后不需要任何值限制,则可以省略显式返回(在这种情况下将使用隐式返回None)但是没有任何损害也没有缺点无论如何返回self

答案 1 :(得分:2)

return self不仅在with语句中有用,而且在许多其他情况下也很有用。

例如,使用以下命令打开文件时

with open("file") as f:
    ....

函数open实际上返回一个实现__enter__的对象,并在其__enter__中使用return self来将此实例绑定到变量f ,以便您可以在f.read之后执行其他操作。

在其他情况下,另一个例子,如果你想链接呼叫(也许data = a.connect().get("key").to_dict())。您需要将return self添加到connectget

但毕竟,return self只不过是返回正常变量。