我经常看到使用self
来管理上下文的代码。例如
with self:
self.x = 4
self.y = 6
这里发生了什么?使用self
作为上下文允许什么?
答案 0 :(得分:4)
使用def k_numerator(n, k):
res = 0
sign = 1
for i in range(k, 0, -1):
pow_term = (i ** n)
comb_term = comb(k, i)
prod = pow_term * comb_term
prod = prod * sign
res = res + prod
sign = sign * -1
return res
def p_exactly_k(n, k):
"""
Returns the probability of `B` containing exactly `k` unique elements
(also see notes above)
"""
return (comb(n, k) * k_numerator(n, k)) / (n ** n)
的代码表明,您使用的任何课程都提供with self:
和__enter__
方法。这些方法创建上下文。它们可以方便地进行测试中的设置/拆卸等。
答案 1 :(得分:4)
这里发生了什么?使用self作为上下文允许什么?
只要该类实现了上下文管理器应该具有的必要“钩子”,Python就允许它像普通的上下文管理器一样使用。 Here is an excerpt from the docs which helps clear things up here:
Python的with语句支持由上下文管理器定义的运行时上下文的概念。这是使用一对方法实现的,这些方法允许用户定义的类定义在语句体执行之前输入的运行时上下文,并在语句结束时退出:
contextmanager.__enter__()
输入运行时上下文并返回此对象或与运行时上下文相关的其他对象。此方法返回的值绑定到使用此上下文管理器的with语句的as子句中的标识符。 [...]
contextmanager.__exit__(exc_type, exc_val, exc_tb)
退出运行时上下文并返回一个布尔标志,指示是否应该抑制发生的任何异常。如果在执行with语句的主体时发生异常,则参数包含异常类型,值和回溯信息。否则,所有三个参数都是None。 [...]
如上所述,当您为类实现必要的__enter__
和__exit__
魔术方法时,Python允许您将其视为上下文管理器。
答案 2 :(得分:0)
如果self
是一个上下文管理器(即具有__enter__
和__exit__
方法),这将只调用该功能,就像在{{中使用实例一样1}}在课堂外阻止。
答案 3 :(得分:0)
这里没有什么特别的事情发生。 with
在self
块中的行为方式与其他任何内容相同。当您进入范围时它会调用with
,当您通过任何方式离开范围时调用__enter__
。我无法想象在这里使用__exit__
会有什么用,但如果你能想出一些你见过的例子,我们或许可以提供更好的答案。