Python中实现函数重载的几种巧妙方法
raise ValueError(f不支持的格式: {format_type})print(processor.process(数据, json)) # 处理JSON: 数据。raise TypeError(f没有找到匹配的函数重载: {types})print(process(test))# 字符串: test。print(process([1,2,3])) # 列表长度: 3。print(pr
### Python中实现函数重载的几种巧妙方法
#### 1. 使用参数默认值实现简单重载
```python
def process_data(data, method=default):
if method == default:
return data
elif method == upper:
return data.upper()
elif method == lower:
return data.lower()
# 使用示例
print(process_data(Hello)) # Hello
print(process_data(Hello, upper)) # HELLO
```
#### 2. 利用可变参数实现灵活重载
```python
def calculate_sum(args):
if len(args) == 1 and isinstance(args[0], list):
return sum(args[0])
else:
return sum(args)
# 使用示例
print(calculate_sum(1, 2, 3)) # 6
print(calculate_sum([1, 2, 3, 4])) # 10
```
#### 3. 基于类型检查的类型重载
```python
def process_input(value):
if isinstance(value, int):
return value 2
elif isinstance(value, str):
return value + value
elif isinstance(value, list):
return len(value)
# 使用示例
print(process_input(5)) # 10
print(process_input(Hi)) # HiHi
print(process_input([1,2,3])) # 3
```
#### 4. 使用functools.singledispatch实现专业重载
```python
from functools import singledispatch
@singledispatch
def process(obj):
raise NotImplementedError(不支持的参数类型)
@process.register
def _(obj: int):
return f整数: {obj}
@process.register
def _(obj: str):
return f字符串: {obj}
@process.register
def _(obj: list):
return f列表长度: {len(obj)}
# 使用示例
print(process(10)) # 整数: 10
print(process(test)) # 字符串: test
print(process([1,2,3])) # 列表长度: 3
```
#### 5. 使用字典映射实现策略模式重载
```python
class DataProcessor:
def __init__(self):
self._processors = {
'json': self._process_json,
'xml': self._process_xml,
'csv': self._process_csv
}
def process(self, data, format_type):
processor = self._processors.get(format_type)
if processor:
return processor(data)
raise ValueError(f不支持的格式: {format_type})
def _process_json(self, data):
return f处理JSON: {data}
def _process_xml(self, data):
return f处理XML: {data}
def _process_csv(self, data):
return f处理CSV: {data}
# 使用示例
processor = DataProcessor()
print(processor.process(数据, json)) # 处理JSON: 数据
```
#### 6. 使用装饰器实现高级重载
```python
class FunctionOverloader:
def __init__(self):
self._functions = {}
def register(self, types):
def decorator(func):
self._functions[types] = func
return func
return decorator
def __call__(self, args):
types = tuple(type(arg) for arg in args)
func = self._functions.get(types)
if func:
return func(args)
raise TypeError(f没有找到匹配的函数重载: {types})
overloader = FunctionOverloader()
@overloader.register(int, int)
def add_ints(a, b):
return a + b
@overloader.register(str, str)
def add_strings(a, b):
return a + b
# 使用示例
print(overloader(1, 2)) # 3
print(overloader(a, b)) # ab
```
#### 7. 使用关键字参数实现命名重载
```python
def create_element(tag, kwargs):
if tag == div:
return f{content(kwargs)}
elif tag == span:
return f{content(kwargs)}
elif tag == img:
return f
def class_attr(kwargs):
return f class='{kwargs['class']}' if 'class' in kwargs else
def content(kwargs):
return kwargs.get('content', '')
# 使用示例
print(create_element(div, content=Hello))
print(create_element(div, class=container, content=World))
```
这些方法各具特色,从简单到复杂,能够满足不同场景下的函数重载需求。选择合适的方法可以提高代码的可读性和可维护性,同时保持Python代码的简洁优雅特性。
更多推荐



所有评论(0)