每天进步一点点:相同函数名重载

#!/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



posted @ 2022-08-12 09:07  Alive_2020  阅读(25)  评论(0编辑  收藏  举报