IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python究竟能不能实现函数重载? -> 正文阅读

[Python知识库]python究竟能不能实现函数重载?

函数重载是什么

定义多个同名函数,但其参数的顺序或命名不同,在调用时,根据提供的参数进行调用,返回对应的值。

不同语言对比

C++:

int square(int a)
{
    return x * x;
}
float square(float b)
{
    return x * x;
}

在调用square函数时,边长类型不一样,返回值也不一样。
如:
square(5),返回值25
square(5.0),返回值25.0
而python3:

def square(a: int):
	return x * x
def square(b: float):
	return x * x

square(5),返回值25.0
square(5.0),返回值25.0
square(a=5),直接报错。
造成这样的原因是python中函数视作一个变量,定义同名函数相当于重定义。

python实现原理

python中的类有一个方法叫__call__,指当被调用时的方法。
简单的实现:

class Square(object):
    def __init__(self):
        pass
    
    def __call__(self, *args, **kwargs):
        if 'a' in kwargs:
            return kwargs['a'] * kwargs['a']
        if 'b' in kwargs:
            return kwargs['b'] * kwargs['b']
        
square = Square()
square(a=1)
square(b=2)

代码实现函数重载

import copy

functions = {}  # 函数字典

class OverloadFunction(object):
    def __init__(self, func):
        self.name = func.__name__
        # 需要deepcopy,函数是可变对象
        if self.name in functions:
            functions[self.name].append(copy.deepcopy(func))
        else:
            functions[self.name] = [copy.deepcopy(func)]
        
    def __call__(self, *args, **kwargs):
        func_list = functions[self.name]
        for func in func_list:
            try:
                return func(*args, **kwargs)  # 逐个试验
            except:
                pass
        raise ValueError
    

def overload(func):
    return OverloadFunction(func)  # 封装

使用例子

@overload
def square(a):
    return a * a

@overload
def square(b):
    return b * b

print(square(a=1))
print(square(b=2))
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:41:15  更:2022-02-07 13:42:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:25:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码