Дженерики, если вы пробовали java, вы должны быть с ним знакомы. Но вы можете не знать, что простые универсальные функции также могут быть реализованы в Python (3.4+).
В Python можно выбрать только конкретный метод реализации в зависимости от типа данных одного (первого) параметра. Официальное название - single-dispatch
. Вы можете этого не понять.Человечески говоря, можно понять, что тип данных первого параметра отличается, и функция, которую он вызывает, также отличается.
singledispatch
Он был представлен в PEP443. Если он вам интересен, PEP443 должен быть лучшим учебным документом: https://www.python.org/dev/peps/pep-0443/
Его использование чрезвычайно просто, если singledispatch
оформленная функция является single-dispatch
общей функцией ( generic functions
).
- Единичная отправка : выполнение одной и той же операции разными способами в зависимости от типа параметра.
- Множественная отправка : поведение специальной функции может быть выбрано в соответствии с типами нескольких параметров.
- Общая функция : несколько функций связаны вместе, чтобы сформировать общую функцию.
Вот простой пример.
from functools import singledispatch
@singledispatch
def age(obj):
print('请传入合法类型的参数!')
@age.register(int)
def _(age):
print('我已经{}岁了。'.format(age))
@age.register(str)
def _(age):
print('I am {} years old.'.format(age))
age(23) # int
age('twenty three') # str
age(['23']) # list
Результаты
我已经23岁了。
I am twenty three years old.
请传入合法类型的参数!
Говоря о дженерик, на самом деле, не редкость в некоторых встроенных функциях самого Python, такой как len()
, iter()
, copy.copy()
, и pprint()
т.д.
Вы спросите, а какая от этого польза? На самом деле, это действительно бесполезно: если вы его не используете или не знаете, это никак не повлияет на ваше кодирование.
Приведу пример, вы это почувствуете.
Всем известно, что в Python существует множество типов данных, таких как str, list, dict, tuple и т. Д. Методы сращивания разных типов данных различны, поэтому здесь я написал общую функцию, которая может быть основана на соответствующем типе данных. Выберите соответствующий метод сращивания для сращивания, и для разных типов данных я должен также указать, что сращивание невозможно. Ниже приводится простая реализация.
def check_type(func):
def wrapper(*args):
arg1, arg2 = args[:2]
if type(arg1) != type(arg2):
return '【错误】:参数类型不同,无法拼接!!'
return func(*args)
return wrapper
@singledispatch
def add(obj, new_obj):
raise TypeError
@add.register(str)
@check_type
def _(obj, new_obj):
obj += new_obj
return obj
@add.register(list)
@check_type
def _(obj, new_obj):
obj.extend(new_obj)
return obj
@add.register(dict)
@check_type
def _(obj, new_obj):
obj.update(new_obj)
return obj
@add.register(tuple)
@check_type
def _(obj, new_obj):
return (*obj, *new_obj)
print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))
# list 和 字符串 无法拼接
print(add([1,2,3], '4,5,6'))
Результат выглядит следующим образом
hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【错误】:参数类型不同,无法拼接!!
Если вы не используете singledispatch, вы можете написать такой код.
def check_type(func):
def wrapper(*args):
arg1, arg2 = args[:2]
if type(arg1) != type(arg2):
return '【错误】:参数类型不同,无法拼接!!'
return func(*args)
return wrapper
@check_type
def add(obj, new_obj):
if isinstance(obj, str) :
obj += new_obj
return obj
if isinstance(obj, list) :
obj.extend(new_obj)
return obj
if isinstance(obj, dict) :
obj.update(new_obj)
return obj
if isinstance(obj, tuple) :
return (*obj, *new_obj)
print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))
# list 和 字符串 无法拼接
print(add([1,2,3], '4,5,6'))
Результат выглядит следующим образом
hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【错误】:参数类型不同,无法拼接!!
Я рекомендую мою оригинальную « PyCharm китайского Guide » электронную книгу, которая содержит большое количество (300) иллюстраций . Это хорошо сделано и достойны коллекций каждого инженера Python.
Адрес: http://pycharm.iswbm.com