每天进步一点点:相同函数名重载
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# DevVersion: Python3.6.8
# Date: 2021-11-16 22:39
# PyCharm|test
from pprint import pprint
"""
函数重载指的的是有多个同名的函数,但他们的签名或实现却不同。
当调用一个重载函数fn时,程序回去检验传递给函数的实参、形参,并据此而调用响应的函数。
Python因为同一个命名空间中,后面定义相同的函数名时都会默认覆盖前面的,所以没有重载函数
local(),global()
"""
from inspect import getfullargspec
def my_test(a, b, c=2, d=(2, 3)):
return
pprint(getfullargspec(my_test)) # 获取一个函数参数的相关情况
# FullArgSpec(args=['a', 'b', 'c', 'd'],
# varargs=None,
# varkw=None,
# defaults=(2, (2, 3)),
# kwonlyargs=[],
# kwonlydefaults=None,
# annotations={})
pprint(getfullargspec(my_test).args) # 获取一个函数定义的参数名称
# ['a', 'b', 'c', 'd']
class Function(object):
"""Function类是对标准的Python函数的封装"""
def __init__(self, fn):
self.fn = fn
def __call__(self, *args, **kwargs):
"""当像函数一样被调用时,它就会调用被装封装的函数,并返回该函数的值"""
return self.fn(*args, **kwargs)
def key(self, args=None):
"""返回一个key标识,能唯一标识出一个函数(即便是被重载的)"""
# 如果不指定args,则从函数的定义中提取参数
if args is None:
args = getfullargspec(self.fn).args
return ([self.fn.__module__,
self.fn.__class__,
self.fn.__name__,
len(args or [])])
def area(a, b):
return a * b
func = Function(area)
pprint(func.key())
pprint(func(2000, 500))
class Namespace(object):
"""Namespace是一个单例类,负责保存所有的函数"""
__instance = None
def __init__(self):
if self.__instance is None:
self.function_map = dict()
Namespace.__instance = self
else:
raise Exception("cannot instantiate a virtual namespace again")
@staticmethod
def get_instance():
if Namespace.__instance is None:
Namespace()
return Namespace.__instance
def register(self, fn):
"""在虚拟的命名 空间中注册函数,并返回Function类的可调用实例"""
func = Function(fn)
self.function_map[func.key()] = fn
return func
人生苦短,我用python!