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

如何为Python类中所有方法统一添加带int类型注解的参数a?

统一为类方法添加带类型注解的参数

我定义了如下包含三个方法的类A:

class A:
  def func_1(self, a: int, b: int):
    print(a, b)
  def func_2(self, a: int, c: int):
    print(a, c)
  def func_3(self, a: int, d: int):
    print(a, d)

我希望避免重复编写a: int,请问是否有办法为这三个方法统一添加带int类型注解的参数a?目前我已搭建如下类装饰器框架:

def cls_decorator(cls):
  for key, value in cls.__dict__.items():
    if callable(value):
      print(key, value, value.__dict__) # need to add `a: int` to functions here
  return cls

@cls_decorator
class A:
   ...

可以借助Python的inspect模块修改函数签名,结合functools.wraps保留原方法元信息,完成统一添加参数的需求。修改后的装饰器代码如下:

import inspect
import functools

def cls_decorator(cls):
    for name, method in cls.__dict__.items():
        # 跳过特殊方法和非可调用属性
        if not callable(method) or name.startswith('__'):
            continue
        
        # 获取原方法的签名
        sig = inspect.signature(method)
        # 定义要添加的参数:a,类型注解为int,位置参数/关键字参数类型
        new_param = inspect.Parameter(
            'a',
            inspect.Parameter.POSITIONAL_OR_KEYWORD,
            annotation=int
        )
        
        # 将a插入到self参数之后(实例方法默认第一个参数是self)
        params = list(sig.parameters.values())
        if params and params[0].name == 'self':
            params.insert(1, new_param)
        else:
            params.insert(0, new_param)
        
        # 生成新的方法签名
        new_sig = sig.replace(parameters=params)
        
        # 包装原方法,保留元信息
        @functools.wraps(method)
        def wrapped(*args, **kwargs):
            return method(*args, **kwargs)
        
        # 为包装后的方法设置新签名和注解
        wrapped.__signature__ = new_sig
        wrapped.__annotations__['a'] = int
        wrapped.__annotations__.update(method.__annotations__)
        
        # 替换类中的原方法
        setattr(cls, name, wrapped)
    return cls

使用这个装饰器后,你可以在类A的方法中直接省略a: int的定义:

@cls_decorator
class A:
    def func_1(self, b: int):
        print(a, b)
    def func_2(self, c: int):
        print(a, c)
    def func_3(self, d: int):
        print(a, d)

关键说明

  1. 签名调整:通过inspect模块修改方法参数列表,确保a参数插入到self之后,符合实例方法的参数顺序规范。
  2. 元信息保留:用functools.wraps保留原方法的名称、文档字符串等属性,避免破坏类方法的原有特性。
  3. 注解同步:手动更新__annotations__字典,保证a的类型注解被正确添加,同时保留原方法的其他类型注解。

内容的提问来源于stack exchange,提问作者apostofes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:21:42