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

Python中为类内处理方法统一函数签名的简化方案

几种简洁的统一方法签名实现方案

1. 类型别名 + 静态类型提示

直接通过类型别名复用统一的方法签名,配合静态类型检查工具(如mypy)就能规范后续开发,完全不需要额外类定义。

首先定义类型别名明确签名:

from typing import Callable

# 统一的进程方法签名:接收int,返回int
ProcessMethod = Callable[[int], int]

然后修改你的类,给方法和字典加上类型提示:

class MainClass():
    def __init__(self):
        self.processes = self.build_dictionary()

    def build_dictionary(self) -> dict[str, ProcessMethod]:
        return {
            'p1': self.Process1,
            'p2': self.Process2,
            'p3': self.Process3
        }

    def Process1(self, data: int) -> int:
        return data
    
    def Process2(self, data: int) -> int:
        return data
    
    def Process3(self, data: int) -> int:
        return data
    
    def run(self):
        values = [1, 2, 3]
        for v in values:
            for p, method in self.processes.items():
                print(f'{p} : {method(v)}')

后续新增Process方法时,只要类型提示不符合ProcessMethod,静态检查工具就会报错,能有效约束开发规范。

2. 使用typing.Protocol(Python 3.8+)

Protocol是轻量的“鸭子类型”规范,不需要让方法继承任何类,只要签名匹配就会被识别,比抽象类简洁得多。

先定义Protocol:

from typing import Protocol

class ProcessProtocol(Protocol):
    def __call__(self, data: int) -> int:
        ...

然后在类里用这个Protocol约束字典的类型:

class MainClass():
    def __init__(self):
        self.processes = self.build_dictionary()

    def build_dictionary(self) -> dict[str, ProcessProtocol]:
        return {
            'p1': self.Process1,
            'p2': self.Process2,
            'p3': self.Process3
        }

    def Process1(self, data: int) -> int:
        return data
    
    def Process2(self, data: int) -> int:
        return data
    
    def Process3(self, data: int) -> int:
        return data
    
    def run(self):
        values = [1, 2, 3]
        for v in values:
            for p, method in self.processes.items():
                print(f'{p} : {method(v)}')

静态检查工具会自动校验所有Process方法的签名是否符合Protocol要求,没有冗余的类结构。

3. 装饰器做运行时校验

如果需要在代码运行时也强制保证参数和返回值类型,可以写一个简单的装饰器来做校验:

def validate_process(func):
    def wrapper(self, data: int) -> int:
        if not isinstance(data, int):
            raise TypeError("data必须是int类型")
        result = func(self, data)
        if not isinstance(result, int):
            raise TypeError("返回值必须是int类型")
        return result
    return wrapper

class MainClass():
    def __init__(self):
        self.processes = self.build_dictionary()

    def build_dictionary(self):
        return {
            'p1': self.Process1,
            'p2': self.Process2,
            'p3': self.Process3
        }

    @validate_process
    def Process1(self, data: int) -> int:
        return data
    
    @validate_process
    def Process2(self, data: int) -> int:
        return data
    
    @validate_process
    def Process3(self, data: int) -> int:
        return data
    
    def run(self):
        values = [1, 2, 3]
        for v in values:
            for p, method in self.processes.items():
                print(f'{p} : {method(v)}')

这个装饰器会在每次调用Process方法时检查输入输出类型,适合对运行时正确性要求高的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:21:04