Ale*_*dro 3 python scope namespaces stack-frame python-3.x
如何在子类的重写方法中访问超类方法的局部变量?
class Foo(object):
def foo_method(self):
x = 3
class Bar(Foo):
def foo_method(self):
super().foo_method()
print(x) # Is there a way to access x, besides making x an attribute of the class?
Run Code Online (Sandbox Code Playgroud)
下面的代码给出了 NameError: name 'x' is not defined
bar = Bar()
bar.foo_method()
Run Code Online (Sandbox Code Playgroud)
这不足为奇,可以通过创建x实例属性来修复它,但是可以x直接访问Bar.foo_method吗?
问....可以在Bar.foo_method中更直接地访问x吗?
按照书面规定,答案是否定的。
等到super().foo_method()返回时,该方法的堆栈框架已经包装好,局部变量也消失了。没有可访问的内容。
共享数据的最简单解决方案是让foo_methodreturn x:
class Foo(object):
def foo_method(self):
x = 3
return x
class Bar(Foo):
def foo_method(self):
x = super().foo_method()
print(x)
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找与动态范围类似的东西,最简单的解决方案是传递一个共享名称空间:
class Foo(object):
def foo_method(self, ns):
x = 3
ns['x'] = 3
class Bar(Foo):
def foo_method(self):
ns = {}
super().foo_method(ns)
x = ns['x']
print(x)
Run Code Online (Sandbox Code Playgroud)
如果要模拟嵌套调用中的动态作用域,请考虑使用collections.ChainMap()。
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |