Python类内带装饰器的实例方法报self参数多值错误求助
错误原因
input_arguments_with_prompts是类的普通实例方法,作为装饰器使用时Python会自动传入类实例作为第一个参数,导致你传入的提示文本参数错位,逻辑不符合预期。- 装饰器内部的
wrapper处理被装饰方法的参数列表时,没有跳过实例方法默认的第一个self参数,尝试为self也生成用户输入值并塞入kwargs。调用实例方法时Python本身会自动将实例对象作为位置参数的第一位传入,最终self参数同时收到位置传参和关键字传参,触发报错。
修复方案
- 给
input_arguments_with_prompts方法添加@staticmethod装饰器,标记为静态方法,避免调用时自动传入实例参数。 - 处理被装饰方法的参数列表时,跳过第一个
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,提问作者Роман Яровой
相关产品推荐
相关产品推荐

