如何在子类中的重写方法中访问超类方法的局部变量?
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
吗?
答案 0 :(得分:3)
Q值。 ...可以直接在Bar.foo_method中按原样访问x吗?
如上所述,答案是否。
到super().foo_method()
返回时,该方法的堆栈框架已被包装,局部变量消失。没有什么可以访问的。
共享数据的最简单方法是让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()。