gpt4 book ai didi

python - __enter__ 和 __exit__ 在 python 3 中的类级别

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

我试图获得神奇的 with 语句方法 __enter____exit__ 在类级别上运行,但没有成功:

class Spam():

@classmethod
def __enter__(cls):
return cls

@classmethod
def __exit__(cls, typ, value, tb):
cls.cleanup_stuff()


with Spam:
pass

但是,这将导致 AttributeError:

Traceback (most recent call last):
File "./test.py", line 15, in <module>
with Spam:
AttributeError: __exit__

是否可以在类级别使用 __enter____exit__ 方法?

最佳答案

__enter____exit__ 是特殊方法,因此只有在 defined on a object's type 时才能正常工作,不在它的实例字典中。

现在 Spamtype 的实例,type(Spam).__enter__type(Spam).__exit__ 不存在。因此你会得到一个属性错误。

要实现此功能,需要在您要使用的类的元类上声明这些方法。示例:

class Spam(type):

def __enter__(cls):
print('enter')
return cls

def __exit__(cls, typ, value, tb):
print('exit')

class Eggs(metaclass=Spam):
pass

with Eggs:
pass

现在 EggsSpam 的一个实例(type(Eggs) == Spam,因此 type(Eggs).__enter__type(Eggs).__exit__ 确实存在)。

然而,定义一个元类只是为了将它的一个实例用作上下文管理器似乎有点过头了。从您的示例开始的更直接的解决方案是使用

with Spam():
pass

或者,如果您想稍后重用同一个实例:

spam = Spam()
with spam:
pass

关于python - __enter__ 和 __exit__ 在 python 3 中的类级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330453/

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