[英]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
connect
并get
。
但是毕竟, return self
只是返回一个普通变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.