访问重写的父方法的局部变量

时间:2017-07-26 00:50:30

标签: python python-3.x scope namespaces stackframe

如何在子类中的重写方法中访问超类方法的局部变量?

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?

下面的代码为NameError: name 'x' is not defined

bar = Bar()
bar.foo_method()

这并不奇怪,可以通过将x设为实例属性来解决,但可以x更直接地Bar.foo_method访问import random >>> pc = random.randint(0,5) >>> >>> while user > 0 & user < 6: while True: user = int(input("enter no")) if user < pc : print("low") elif user > pc: print("high") else : print("correct") break 吗?

1 个答案:

答案 0 :(得分:3)

摘要

  

Q值。 ...可以直接在Bar.foo_method中按原样访问x吗?

如上所述,答案是否

super().foo_method()返回时,该方法的堆栈框架已被包装,局部变量消失。没有什么可以访问的。

替代解决方案:return语句

共享数据的最简单方法是让foo_method返回 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)

替代解决方案:动态范围

如果您正在寻找类似于dynamic scoping的内容,最简单的解决方案是传入共享命名空间:

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)

如果要在嵌套调用中模拟动态范围,请考虑使用collections.ChainMap()