在main函数创建实例时,ClassTwo调用ClassOne方法的问题求助
解决ClassTwo调用ClassOne方法传错实例的问题
问题核心就是你用ClassOne.regions(self)时,把ClassTwo的实例当成了ClassOne的实例传进去,ClassTwo里没有ClassOne加载后的数据,自然返回空列表。下面给两种实用的解决办法:
办法一:给ClassTwo注入ClassOne实例(推荐,适合需要复用ClassOne数据的场景)
在ClassTwo初始化的时候,把已经加载好数据的ClassOne实例传进去,之后直接用这个实例调用regions方法:
class ClassOne: def __init__(self): self.regions_list = [] def load(self, csv_path): # 这里写读取CSV并填充self.regions_list的逻辑 # 示例:假设CSV每行是一个地区,读取后存列表 with open(csv_path, 'r') as f: self.regions_list = [line.strip() for line in f.readlines()[1:]] # 跳过表头 def regions(self): return self.regions_list class ClassTwo: def __init__(self, class_one_obj): self.class_one = class_one_obj # 保存ClassOne的实例 self.parsed_data = {} def load(self, csv_path): # 直接用传入的ClassOne实例调用regions方法 regions = self.class_one.regions() # 这里写ClassTwo自己的CSV解析逻辑,比如结合regions处理数据 with open(csv_path, 'r') as f: for line in f.readlines()[1:]: parts = line.strip().split(',') if parts[0] in regions: self.parsed_data[parts[0]] = parts[1] def main(): # 先创建ClassOne实例并加载数据 one = ClassOne() one.load('class_one_regions.csv') # 把加载好的ClassOne实例传给ClassTwo two = ClassTwo(one) two.load('class_two_data.csv') # 验证结果 print(two.parsed_data) if __name__ == "__main__": main()
办法二:在ClassTwo的load方法内创建ClassOne实例(适合不需要复用ClassOne数据的场景)
如果ClassOne的数据不需要在多个ClassTwo实例间复用,可以在ClassTwo的load方法里临时创建ClassOne实例并加载数据:
class ClassTwo: def load(self, csv_path): # 临时创建ClassOne实例并加载数据 one = ClassOne() one.load('class_one_regions.csv') regions = one.regions() # 后续处理自己的CSV逻辑 self.parsed_data = {} with open(csv_path, 'r') as f: for line in f.readlines()[1:]: parts = line.strip().split(',') if parts[0] in regions: self.parsed_data[parts[0]] = parts[1] def main(): two = ClassTwo() two.load('class_two_data.csv') print(two.parsed_data) if __name__ == "__main__": main()
关键提醒
- 不要直接用
ClassOne.regions(self)这种方式调用实例方法,实例方法需要对应类的实例才能正确访问内部属性。 - 如果ClassOne的load操作比较耗时,优先用办法一,避免重复加载CSV浪费资源。
内容的提问来源于stack exchange,提问作者andsemenov
相关产品推荐
相关产品推荐

