gpt4 book ai didi

python - 如何将子上下文的管理委托(delegate)给父级

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:36 25 4
gpt4 key购买 nike

假设我们有一个类“A”,它本身就充当上下文管理器,因此它实现了

def __enter__()
def __exit__()

界面。客户端代码直接使用 with 语句创建“A”对象是有效的。

现在,我们还有另一个类“B”,它封装了其他功能,也使用了“A”对象。

如果我们想让“B”也充当上下文管理器,管理它的“A”实例的正确方法是什么?

__enter____exit__ 在 'B' 上的实现是否应该调用 __enter____exit__ (分别)它是 A 对象实例?或者有更好的方法吗?

举一个具体的例子(这不是我在我的应用程序中使用的,它只是我想到的第一个非抽象的例子)考虑两个类

  • 数据库连接
  • 数据库连接池

单独使用单个DatabaseConnection 是有效的,因此DatabaseConnection 实现了上下文管理器接口(interface)。

DatabaseConnectionPool 使用了多个 DatabaseConnections 以及其他零碎的东西。使用 DatabaseConnectionPool(即“with”)应该对它的 DatabaseConnection 实例进行设置和拆除(以及它可能想要做的任何其他事情)

更新:我写了一些测试代码,我希望它能提供以下输出:

Enter invoked on OuterEnter invoked on InnerWithin outer context...do_foo invoked!Still using outer...Exit invoked on innerExit invoked on outerDone using outer

but I got the following:

Enter invoked on OuterEnter invoked on InnerExit invoked on innerWithin outer context...do_foo invoked!Still using outer...Exit invoked on outerDone using outer

Code:


class Inner(object):
def __enter__(self):
print "Enter invoked on Inner"
return self

def __exit__(self, typ, val, tb):
print "Exit invoked on inner"

def do_foo(self):
print "do_foo invoked!"

class Outer(object):
def __init__(self):
self._inner = Inner()

def __enter__(self):
print "Enter invoked on Outer"

with self._inner as ctx:
return self

def __exit__(self, typ, val, tb):
print "Exit invoked on outer"

with Outer() as outer:
print "Within outer context..."
outer._inner.do_foo()
print "Still using outer..."

print "Done using outer"

关于如何使这项工作有任何想法吗?

最佳答案

FWIW,我有相同的设计考虑,最终在我的“子”类中编写退出和进入函数,并且只有“父”类是上下文管理器。

(如果我正确理解了您的问题,那就是“当我关闭父上下文管理器时,我如何优雅地让我在上下文管理器类中使用的所有类正确关闭”

关于python - 如何将子上下文的管理委托(delegate)给父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24235083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com