使用带有“ with”语句的类执行代码,但是在运行某些功能之前不执行代码吗?

问题描述 投票:-1回答:2

如何使用带有“ 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

这可能吗?

python python-3.x
2个回答
0
投票

我认为您无法按照当前代码的编写方式进行操作。但是,您实际上希望从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)

0
投票

不是,仅在执行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()

就我所知,这与您的示例非常接近,包括名称。我认为也许直接将构造函数用作装饰器有点麻烦-您可能更喜欢使用单独的装饰器函数来调用并返回类实例,但您可以理解。

© www.soinside.com 2019 - 2024. All rights reserved.