import types
from functools import update_wrapper
from inspect import signature, Parameter
class MultiMethod:
def __init__(self, func):
update_wrapper(self, func)
self._method_dict = {}
self.add_method(func)
def add_method(self, func):
sig = signature(func)
# 此处 self 不需要 注解
param_types = tuple(param.annotation for param in sig.parameters.values() if param.name != 'self')
if Parameter.empty in param_types:
raise TypeError("annotation required for all params")
if param_types in self._method_dict:
raise TypeError("duplicate method signature")
self._method_dict[param_types] = func
return self
def __call__(self, *args):
# args 第一个参数是 foo实例,用来手动传入,绑定func的 self
# 后面的才是实际的参数
param_types = tuple(type(arg) for arg in args[1:])
if param_types in self._method_dict:
return self._method_dict[param_types](*args)
else:
raise TypeError("not method found")
def __get__(self, instance, owner):
if instance is None:
return self
else:
# foo.bar 时 手动绑定,返回一个绑定方法对象
return types.MethodType(self, instance)
class Foo:
@MultiMethod
def bar(self, a: int):
print(a)
@bar.add_method
def bar(self, a: int, b: int):
print(a, b)
if __name__ == "__main__":
f = Foo()
print(f.bar)
f.bar(1)
f.bar(1, 2)
f.bar('1')
Python 用装饰器类实现方法重载
原创番东 ©著作权
文章标签 python 文章分类 JavaScript 前端开发
上一篇:Go 基于chan 管道生成素数
下一篇:Python用元类实现缓存实例
-
常用的10个Python装饰器
python中常用的10个装饰器
python 装饰器 py装饰器 -
用类作为装饰器装饰函数!
用类作为装饰器装饰函数!
类作 装饰器 装饰函数 -
函数装饰器和类装饰器实现单例类
python里通过函数装饰器和类装饰器实现单例类的两个示例。
python 装饰器 类装饰器 函数装饰器