如何使用带有“ with”语句的类执行代码,但是在运行某些功能之前不要执行代码?
例如,如果我有课程:
class Foo:
def __init__(self):
self.bar = "baz"
def __enter__(self):
return self
def __exit__(self, x, y, z):
return None
def run(self):
# Start running code inserted into __enter__?
而且我使用了类似的类:
bar = Foo()
with bar as f:
print(f.bar)
# Don't execute this code until run() is called
bar.run()
# Now execute the code that was inserted into the with statement above
这可能吗?
我认为您无法按照当前代码的编写方式进行操作。但是,您实际上希望从bar.run()
调用Foo.__enter__
。
class Foo:
def __init__(self, pre=None):
self.bar = "baz"
def __enter__(self):
self.run()
return `self`
def __exit__(self, x, y, z):
return None
def run(self):
# Start running code inserted into __enter__?
bar = Foo()
with bar as f:
print(f.bar)
不是,仅在执行with块期间执行with块内部的代码。例如,它没有作为闭包传递给上下文管理器。
如果您想要该行为,则可以使用装饰器和局部函数声明来代替with块。
class Foo:
def __init__(self, callback):
self.callback = callback
self.bar = 'baz'
def run(self):
# Setup goes here.
try:
self.callback(self)
finally:
# Cleanup goes here.
pass
@Foo
def bar(f):
print(f.bar)
bar.run()
就我所知,这与您的示例非常接近,包括名称。我认为也许直接将构造函数用作装饰器有点麻烦-您可能更喜欢使用单独的装饰器函数来调用并返回类实例,但您可以理解。