【发布时间】:2021-10-07 08:23:42
【问题描述】:
假设我有一个如下所示的类:
class Foo:
def __init__(self, method):
self.method = method
def do_action(self):
self.method()
我想按如下方式实例化它:
some_var = False
def bar():
# Modifies existing variable's value
global some_var
some_var = True
foo = Foo(bar)
如何在不必定义 bar() 方法的情况下做到这一点? 我已经尝试了以下方法,但它不起作用。
foo = Foo(lambda: (some_var := True))
当我这样做时,IDE 会告诉我需要一个标识符。提前致谢!
编辑:
感谢那些回答的人,但是我并没有真正找到我需要的东西。不确定这是否是最佳实践,但我最终使用了 python 的 exec 并且它按预期工作:
foo = Foo(lambda: exec("some_var = True"))
【问题讨论】:
-
您可能需要包含更多代码。
some_var实际上应该是什么?您的示例bar是无操作的,因为some_var是一个局部变量。 -
假设
some_var是一个局部/全局变量,如果你真的,真的想要做这样的事情,你可以添加nonlocal some_var或global some_var(每个都适合)到bar。但是这个问题听起来真的很像XY problem。您能否详细说明为什么要向修改局部/全局变量的对象添加方法? -
@Samwise 它应该更改现有全局变量的值。我认为
bar中的评论就足够了,但我会添加一个声明。 -
哦,这太恶心了,您必须使用
globals()才能在 lambda 中修改它。不要这样做海事组织。全局变量已经够糟糕了,没有像这样不必要的奇怪恶作剧。
标签: python function methods lambda parameter-passing