繁体   English   中英

返回“自我”? 它真正的作用是什么,我们什么时候需要返回自我

[英]Returning “self”? what does it really do and when do we need to return self

我遇到了类似于以下代码:

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()

我找到相关答案这个 ,但是当我改变上面的代码

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实际会做什么以及如何使用?

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

with makepara() as var:
    ...

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

如果在进入上下文后不需要任何值绑定,则可以省略显式返回(无论如何,在这种情况下都将使用隐式返回None ),但是无论如何返回self都没有害处和缺点。

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只是返回一个普通变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM