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
相关产品推荐
相关产品推荐

