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

Python类内带装饰器的实例方法报self参数多值错误求助

错误原因
  • input_arguments_with_prompts是类的普通实例方法,作为装饰器使用时Python会自动传入类实例作为第一个参数,导致你传入的提示文本参数错位,逻辑不符合预期。
  • 装饰器内部的wrapper处理被装饰方法的参数列表时,没有跳过实例方法默认的第一个self参数,尝试为self也生成用户输入值并塞入kwargs。调用实例方法时Python本身会自动将实例对象作为位置参数的第一位传入,最终self参数同时收到位置传参和关键字传参,触发报错。
修复方案
  1. 给input_arguments_with_prompts方法添加@staticmethod装饰器,标记为静态方法,避免调用时自动传入实例参数。
  2. 处理被装饰方法的参数列表时,跳过第一个self参数,仅为后续业务参数生成用户输入。
修复后完整代码
import inspect


documents = [
    {"type": "passport", "number": "2207 876234", "name": "Gloria", },
    {"type": "invoice", "number": "11-2", "name": "Jack Nickolas", },
    {"type": "insurance", "number": "10006", "name": "John", }
]

class DocumentManager:
    def __init__(self, doc):
        self._documents = doc

    @staticmethod
    def input_arguments_with_prompts(*prompts):
        def decorator(func):
            def wrapper(*args, **kwargs):
                # 跳过实例方法第一个self参数
                parameters = list(inspect.signature(func).parameters.items())[1:]
                for prompt, (name, parameter) in zip(prompts, parameters):
                    while True:
                        value = input(prompt)
                        if parameter.annotation is inspect._empty:
                            converted_value = value
                            break
                        try:
                            converted_value = parameter.annotation(value)
                        except ValueError:
                            pass
                        else:
                            break
                    kwargs[name] = converted_value
                return func(*args, **kwargs)
            return wrapper
        return decorator

    def get_owner_by_number(self, number: str) -> str:
        for document in self._documents:
            if document["number"] == number:
                return document["name"]
        return ""

    @input_arguments_with_prompts(
        "Enter the document number, the owner of which you want to get: ",
    )
    def get_owner_by_number_input_value1(self, input_number: str):
        return self.get_owner_by_number(input_number)

    def get_owner_by_number_input_value2(self):
        input_number = input('Enter number')
        return self.get_owner_by_number(input_number)

dm = DocumentManager(documents)
dm.get_owner_by_number_input_value1()

内容的提问来源于stack exchange,提问作者Роман Яровой

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:04