如何实现跨文件访问变量?MyClassB如何读取MyClassAC中的字典k?
解决方案
你可以根据使用场景选择以下任意一种实现方式:
方案1:参数传递(推荐,无耦合)
直接在调用run方法时将k作为参数传入,不需要修改现有继承逻辑,也不存在模块耦合问题:
- 修改
MyClassB.py的run方法,增加参数接收k:
class MyClassB: print('This is MyClassB!') @classmethod def run(cls, k): for _i in cls.codes: print(k[_i])
- 修改
MyClassAC.py的调用逻辑,传入生成好的k:
# 原有生成k的代码不变 MyClassC.run(k)
方案2:绑定为子类类属性(适配现有调用逻辑)
因为你是通过子类MyClassC调用run方法,类方法的cls参数实际指向MyClassC,只需要把k绑定为MyClassC的类属性即可直接访问:
- 修改
MyClassAC.py,生成k后给子类增加类属性:
k = {} for i in MyClassC.codes: k[i] = MyClassC MyClassC.k = k # 新增这一行 MyClassC.run()
- 修改
MyClassB.py的run方法,从cls取属性即可:
@classmethod def run(cls): for _i in cls.codes: print(cls.k[_i])
方案3:模块内导入(不推荐,耦合度高)
如果不想修改现有调用和类结构,可以在run方法内部延迟导入MyClassAC模块的k,避免顶部导入出现循环依赖问题:
# MyClassB.py 的run方法实现 @classmethod def run(cls): from MyClassAC import k # 内部延迟导入 for _i in cls.codes: print(k[_i])
关于大体积k的性能问题
把k设置为类属性不会影响性能。Python中的类属性存储的是对象的内存引用,不是完整复制对象,哪怕k占用上百MB内存,类属性仅占用一个指针大小的存储空间,不会产生额外的内存开销或性能损耗。
内容的提问来源于stack exchange,提问作者jaried
相关产品推荐
相关产品推荐

