Django调用自定义类方法时的参数与类型错误解决咨询
解决方案:正确调用Django中ExtractingTextFromFile的filterAnanas方法
错误原因分析
- 错误1:直接调用
ExtractingTextFromFile.filterAnanas(self)时,self是ReadingFile的实例,而非ExtractingTextFromFile实例,自然没有后者的get_text_from_image方法——类方法调用必须使用对应类的实例,不能跨类传self。 - 错误2:创建实例后调用
extract_instance.filterAnanas()报错参数类型错误,说明filterAnanas需要特定参数(比如文件路径)但你没传,或者实例化ExtractingTextFromFile时缺少必要的初始化参数。 - 错误3:给
filterAnanas加file_name参数后,extract_text_from_image报错参数过多,因为该方法定义仅接受self,但你在filterAnanas内部调用它时额外传了file_name,参数不匹配。
正确调用方案
根据类的职责设计,我们需要让ExtractingTextFromFile明确接收文件信息,内部方法参数匹配。以下是两种可行实现:
方案1:通过初始化传入文件路径
# 修正ExtractingTextFromFile类 class ExtractingTextFromFile: def __init__(self, file_path): # 初始化时保存文件路径为实例属性 self.file_path = file_path def extract_text_from_image(self): # 使用实例属性self.file_path处理文件 with open(self.file_path, 'rb') as f: # 这里替换成你的PDF文本提取逻辑(比如用pdfplumber/PyPDF2) extracted_text = f.read().decode('utf-8', errors='ignore') return extracted_text def filterAnanas(self): # 调用内部方法时无需额外传参,直接用实例属性 raw_text = self.extract_text_from_image() # 筛选特定子文本的逻辑(示例:筛选包含"ananas"的行) filtered_lines = [line.strip() for line in raw_text.splitlines() if 'ananas' in line.lower()] return filtered_lines # 在ReadingFile的post方法中调用 class ReadingFile(View): def post(self, request): uploaded_file = request.FILES.get('file') if not uploaded_file: return JsonResponse({'error': '未上传文件'}, status=400) # 临时保存上传的文件(Django上传文件为InMemoryUploadedFile,需落地才能读取) import os temp_path = os.path.join('/tmp', uploaded_file.name) with open(temp_path, 'wb+') as dest: for chunk in uploaded_file.chunks(): dest.write(chunk) # 正确实例化并调用方法 extractor = ExtractingTextFromFile(temp_path) result = extractor.filterAnanas() # 清理临时文件(可选) os.remove(temp_path) return JsonResponse({'filtered_text': result})
方案2:调用filterAnanas时直接传文件路径
如果不想在初始化时传参,可修改方法让filterAnanas接收文件路径:
class ExtractingTextFromFile: def extract_text_from_image(self, file_path): # 直接接收文件路径参数 with open(file_path, 'rb') as f: extracted_text = f.read().decode('utf-8', errors='ignore') return extracted_text def filterAnanas(self, file_path): # 调用提取方法时传入文件路径 raw_text = self.extract_text_from_image(file_path) filtered_lines = [line.strip() for line in raw_text.splitlines() if 'ananas' in line.lower()] return filtered_lines # ReadingFile的post方法调用部分 extractor = ExtractingTextFromFile() result = extractor.filterAnanas(temp_path)
关键注意点
- 必须确保
ExtractingTextFromFile的实例能获取到上传文件的有效路径(Django上传的文件需要先保存到临时目录,不能直接用内存文件对象)。 - 类内部方法的参数要严格匹配:如果方法定义只接受
self,调用时就不能额外传参;反之如果需要参数,必须明确传递。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

