Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带“的类执行代码”;加上;声明,但不要';在运行某个函数之前,是否不执行代码?_Python_Python 3.x - Fatal编程技术网

Python 使用带“的类执行代码”;加上;声明,但不要';在运行某个函数之前,是否不执行代码?

Python 使用带“的类执行代码”;加上;声明,但不要';在运行某个函数之前,是否不执行代码?,python,python-3.x,Python,Python 3.x,如何使用带有“with”语句的类执行代码,但在运行某个函数之前不执行代码 例如,如果我有课程: Foo类: 定义初始化(自): self.bar=“baz” 定义输入(自我): 回归自我 定义退出(自、x、y、z): 一无所获 def运行(自): #开始运行插入到_输入_中的代码? 我使用的课程如下: bar=Foo() 将条形图作为f: 打印(f.bar) #在调用run()之前不要执行此代码 bar.run() #现在执行插入上述with语句的代码 这可能吗?我认为您无法做到这一点,

如何使用带有“with”语句的类执行代码,但在运行某个函数之前不执行代码

例如,如果我有课程:


Foo类:
定义初始化(自):
self.bar=“baz”
定义输入(自我):
回归自我
定义退出(自、x、y、z):
一无所获
def运行(自):
#开始运行插入到_输入_中的代码?
我使用的课程如下:


bar=Foo()
将条形图作为f:
打印(f.bar)
#在调用run()之前不要执行此代码
bar.run()
#现在执行插入上述with语句的代码

这可能吗?

我认为您无法做到这一点,因为您目前编写代码的方式是这样的。但是,实际上,您希望从
Foo.\uuuu输入\uuuu
调用
bar.run()

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()

这是我能得到的最接近你的例子,包括名字。我认为直接将构造函数作为decorator应用可能有点笨拙-您可能更喜欢使用单独的decorator函数来调用和返回类实例,但您得到了一般的想法。

您可以将代码放入函数中并将其传递给
Foo
的构造函数,或者进入
run
方法?如果不可能,是否有任何特殊原因导致您不能在调用
bar.run()
后将
with
块放入代码中?也许你可以给我们看一个真实的例子,因为我真的不明白为什么你要把
with
块放在调用
bar.run()
之前,如果你想让它在后面运行的话。我想OP的意思是把
with bar作为f:
块中包含的代码推迟到调用
bar.run
为止,在上下文管理器退出后的某个时间点。您只需在进入上下文管理器时调用
run
方法,然后继续运行
with
块中包含的代码,这不是OP想要的。我知道这是他想要的,但除了使用
内省
动态重写代码之外,
\u enter\u
无法做到这一点。它看不到带有
语句的
主体。我正在尝试提供一种可用于模拟预期结果的替代方案。尽管我确实意识到这里可能有一个显著的区别:在这个问题中,
\uuuuu exit\uuuuu
将在
运行之前运行;在这里,它将在后面运行。此外,还不清楚是否真的需要
with
来实现它的括号行为,而不是试图捕获一块代码以便稍后执行。