Python同一类内如何将一个成员函数的返回值传递给另一成员函数使用
问题根因
- 类方法的
return返回值不会自动持久化存储,你调用open_file()后返回的file_vals列表没有被接收,直接被丢弃了 joiner()方法定义时要求传入file_vals参数,实际调用时没有传入任何参数,自然无法获取到对应值- 额外隐藏问题:如果
words.txt文件行数不足20行,原代码不会走到else分支,open_file()没有return语句,会默认返回None,即使接收返回值也会报错
类方法中return的正确用法
类方法的return返回值需要在调用侧主动接收,常见用法有两种:
- 调用方法时将返回值赋值给变量,后续需要使用时直接传入变量即可
- 如果返回值需要在同一个实例的多个方法中复用,可以把返回值绑定到实例自身的
self.xxx属性上,所有实例方法都可以直接读取该属性,不需要反复传参
修复方案
方案1:调用时接收返回值传入joiner
修改后的完整代码如下:
import nltk nltk.download('wordnet') from nltk.corpus import wordnet as wn class Sentence: def open_file(self): file_vals = [] i = 0 with open("words.txt", "r") as my_file: for line in my_file: if i < 20: stripped_line = line.strip() file_vals.append(stripped_line) i += 1 else: break print(file_vals) return file_vals def joiner(self, file_vals): val_1 = wn.synsets(file_vals[0])[0].pos() val_2 = wn.synsets(file_vals[1])[0].pos() if val_1 == "n" and val_2 == "v": print(val_1.capitalize() + " " + val_2 + ".") my_obj = Sentence() # 接收open_file的返回值 file_content = my_obj.open_file() # 把返回值传入joiner方法 my_obj.joiner(file_content)
方案2:将返回值绑定到实例属性,无需传参
如果file_vals需要在多个实例方法中复用,更推荐这种写法:
import nltk nltk.download('wordnet') from nltk.corpus import wordnet as wn class Sentence: def open_file(self): # 把读取到的内容绑定到实例属性,所有实例方法都可访问 self.file_vals = [] i = 0 with open("words.txt", "r") as my_file: for line in my_file: if i < 20: stripped_line = line.strip() self.file_vals.append(stripped_line) i += 1 else: break print(self.file_vals) # 不需要额外传入file_vals参数 def joiner(self): val_1 = wn.synsets(self.file_vals[0])[0].pos() val_2 = wn.synsets(self.file_vals[1])[0].pos() if val_1 == "n" and val_2 == "v": print(val_1.capitalize() + " " + val_2 + ".") my_obj = Sentence() my_obj.open_file() # 直接调用即可,方法内部自动读取实例的file_vals属性 my_obj.joiner()
注意事项
调用wn.synsets()时如果对应单词不在wordnet词库中,会返回空列表,直接取[0]会报索引错误,建议添加非空判断避免运行报错。
内容的提问来源于stack exchange,提问作者Brian Zou
相关产品推荐
相关产品推荐

