Implementando la sobrecarga de funciones en Python, el 60% de las personas no

Supongamos que tiene una función connect, que tiene una dirección de parámetro, que puede ser una cadena o una tupla. Por ejemplo:

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))
复制代码

Desea ser compatible con estas dos formas de escribir en el código, por lo que puede escribir el código de esta manera:

def connect(address):
    if isinstance(address, str): ip, port = address.split(':') elif isinstance(address, tuple): ip, port = address else: print('地址格式不正确') 复制代码

Esta forma de escribir es simple y directa, pero si hay más tipos de parámetros, entonces necesita escribir mucho  if-elif-elif-...-else. El código se ve muy feo.

Los estudiantes que han estudiado Java deben estar familiarizados con la sobrecarga de funciones. Puede definir varias funciones con el mismo nombre, pero sus tipos o números de parámetros son diferentes, para implementar una lógica de código diferente.

En Python, el número de parámetros diferentes se puede resolver mediante el uso de parámetros predeterminados, sin definir múltiples funciones. Si los tipos de parámetros son diferentes, se pueden implementar diferentes lógicas.Además de lo anterior  if-else, también podemos usar functoolsel singledispatchdecorador en el módulo para implementar la sobrecarga de funciones.

Escribamos un código:

from functools import singledispatch

@singledispatch
def connect(address): print(f' 传输参数类型为:{type(address)},不是有效类型') @connect.register def _(address: str): ip, port = address.split(':') print(f'参数为字符串,IP是:{ip}, 端口是:{port}') @connect.register def _(address: tuple): ip, port = address print(f'参数为元组,IP是:{ip}, 端口是:{port}') connect('123.45.32.18:8080') connect(('123.45.32.18', 8080)) connect(123) 复制代码
  1. Ejecutemos este código, veamos qué diferentes efectos se basan en diferentes parámetros:

 

 Se puede ver que las funciones que llamamos son siempre las mismas connect, pero debido a los diferentes tipos de parámetros entrantes, los resultados de su operación también son diferentes.

Usamos para singledispatchdecorar una función, entonces esta función es la función que llamaremos.

La implementación específica de esta función cuando los parámetros entrantes son diferentes se logra a través de las funciones registradas a continuación. Use @我们定义的函数名.registerpara registrarse cuando se registre. No importa cuál sea el nombre de la función registrada, por lo que utilizaré guiones bajos en su lugar.

El primer parámetro de la función registrada determina qué tipo debe usar a través de anotaciones de tipo. Cuando llamamos a la función que definimos, si el tipo de parámetro se ajusta a una función registrada, la función registrada se ejecutará. Si el tipo de parámetro no satisface ninguna de las funciones registradas, se ejecutará nuestra función original.

El uso de anotaciones de tipo para especificar tipos de parámetros es una nueva característica introducida desde Python 3.7. En Python 3.6 o anterior, debemos @我们定义的函数名.register(类型)especificar el tipo, por ejemplo:

from functools import singledispatch

@singledispatch
def connect(address): print(f' 传输参数类型为:{type(address)},不是有效类型') @connect.register(str) def _(address): ip, port = address.split(':') print(f'参数为字符串,IP是:{ip}, 端口是:{port}') @connect.register(tuple) def _(address): ip, port = address print(f'参数为元组,IP是:{ip}, 端口是:{port}') 复制代码

Al mismo tiempo, hay otro punto a tener en cuenta que solo se sobrecargarán los diferentes tipos del primer parámetro. El cambio de tipo de los siguientes parámetros se ignorará automáticamente.

Nota final: ya sea ​​que trabaje en Python o tenga pasatiempos, recuerde: la experiencia en el desarrollo de proyectos es siempre el núcleo. Si no tiene la última introducción de Python a video tutoriales prácticos avanzados en 2020, puede ir al intercambio de Python del editor. Puede encontrarlo bajo la conversión de siete o siete y cinco (el número homofónico). ¡Hay muchos proyectos nuevos de tutoriales de Python en él, y también puede hablar con el controlador anterior para obtener consejos!
El texto y las imágenes de este artículo provienen de Internet más sus propias ideas. Son solo para el aprendizaje y la comunicación. No tienen ningún uso comercial. Los derechos de autor pertenecen al autor original. Si tiene alguna pregunta, contáctenos a tiempo para su procesamiento.

Supongo que te gusta

Origin www.cnblogs.com/chengxuyuanaa/p/12719855.html
Recomendado
Clasificación