You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django调用自定义类方法时的参数与类型错误解决咨询

解决方案:正确调用Django中ExtractingTextFromFile的filterAnanas方法

错误原因分析

  1. 错误1:直接调用ExtractingTextFromFile.filterAnanas(self)时,self是ReadingFile的实例,而非ExtractingTextFromFile实例,自然没有后者的get_text_from_image方法——类方法调用必须使用对应类的实例,不能跨类传self。
  2. 错误2:创建实例后调用extract_instance.filterAnanas()报错参数类型错误,说明filterAnanas需要特定参数(比如文件路径)但你没传,或者实例化ExtractingTextFromFile时缺少必要的初始化参数。
  3. 错误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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:21:34