访问覆盖的父方法的局部变量

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吗?

Ray*_*ger 5

摘要

问....可以在Bar.foo_method中更直接地访问x吗?

按照书面规定,答案是否定的

等到super().foo_method()返回时,该方法的堆栈框架已经包装好,局部变量也消失了。没有可访问的内容。

替代解决方案:return语句

共享数据的最简单解决方案是让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()