Python中仅重写子类method1,基类method2如何访问其全局变量v1?
问题解决:让父类方法访问子类定义的全局变量
问题还原
现有两个Python文件:
File1: test1.py
class C1(object): def __init__(self): pass def method1(self): global v1 v1 = "cat" self.method2() def method2(self): print(v1)
File2: test2.py
from test1 import C1 class C2(C1): def __init__(self): super(C2, self).__init__() def method1(self): global v1 v1 = "dog" self.method2()
执行测试代码:
c2 = C2() c2.method1()
会抛出错误:NameError: name 'v1' is not defined
报错原因
全局变量是模块级的:C1的method2里引用的v1是test1模块的全局变量,而C2的method1定义的v1是test2模块的全局变量,两者不是同一个对象。当method2执行时,test1模块的v1从未被赋值,所以触发报错。
解决方案(仅重写method1)
只需要在C2的method1中,同时给test1模块的全局变量v1赋值即可:
修改后的test2.py:
from test1 import C1 import test1 # 导入test1模块本身 class C2(C1): def __init__(self): super().__init__() def method1(self): global v1 v1 = "dog" # 给test1模块的v1赋值,让父类method2能访问到 test1.v1 = v1 self.method2()
执行测试代码后,会输出dog,符合预期。
额外建议(更规范的写法)
全局变量容易引发这类作用域混淆问题,更合理的做法是改用实例属性,但这需要修改C1的代码:
- 在C1的
__init__中初始化self.v1 method1中赋值self.v1而非全局变量method2中打印self.v1
不过如果要求只能重写method1,前面的方案就足够解决问题。
内容的提问来源于stack exchange,提问作者tunar
相关产品推荐
相关产品推荐

