Python lo hace fácil: cómo diseñar la herencia de clases de manera más concisa

Cuando utilizamos la programación orientada a objetos de Python, a menudo nos encontramos con situaciones en las que es necesario diseñar subclases para manejar cualquier cambio o adición a sus clases principales sin ajustes constantes. Esta situación ocurre a menudo en el método init de una clase, especialmente cuando se trata de herencia.

Para manejar esta situación con elegancia, Python proporciona convenciones *argsy . **kwargsAntes de profundizar en el ejemplo principal, comprendamos brevemente cuáles son estas convenciones:

*args: le permite pasar un número variable de argumentos que no son palabras clave a la función. Estos argumentos se capturan en una tupla.

**kwargs: permite pasar un número variable de argumentos de palabras clave a una función. Estos parámetros se capturan en un diccionario.

Armados con este conocimiento, veamos un escenario donde estas convenciones pueden entrar en juego.

Escenario: ampliar la clase principal

Supongamos que tenemos una clase A que acepta dos parámetros en su constructor:

class A:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
        print(f"类A的构造函数带有参数: {arg1}, {arg2}")

Ahora, si diseñamos una clase B que hereda de la clase A, y queremos que la clase B se adapte a cualquier cambio en la clase A sin tener que modificar la clase B cada vez, podemos usar y para hacer que el método init de la clase B *argssea genérico :**kwargs

class B(A):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)  # 将所有参数传递给类A的构造函数
        print("类B的构造函数")

Al diseñar la clase B de esta manera, cualquier cambio en la firma del método init de la clase A no interrumpirá nuestra creación de instancias de la clase B siempre y cuando nos aseguremos de que los parámetros pasados ​​a la clase B cumplan con los requisitos de actualización de la clase A.

Por ejemplo:

b = B("Hello", "World") 
# 输出: 
# 类A的构造函数带有参数: Hello, World
# 类B的构造函数

Ventajas de este enfoque:

  • Flexibilidad: Las modificaciones de Clase B a Clase A siguen siendo resilientes. Esto es especialmente útil en proyectos o bibliotecas más grandes, por ejemplo, la clase A podría ser parte de un módulo que recibe actualizaciones.

  • Mantenibilidad: a medida que el proyecto crece, los desarrolladores no tienen que volver a visitar la clase B cada vez que cambia la clase A.

  • Código más limpio: capturamos todos los parámetros de forma genérica en lugar de procesar cada uno individualmente, haciendo que el código sea más limpio y claro.

Precauciones:

Aunque este enfoque ofrece flexibilidad, también requiere precaución:

Pasar ciegamente todos los parámetros a veces puede tener consecuencias no deseadas, especialmente si el constructor de la clase A se cambia de una manera que es incompatible con la forma en que se crea una instancia de la clase B.

La depuración puede ser un poco difícil, ya que los mensajes de error pueden apuntar al constructor de la superclase, en lugar de a la clase derivada.

en conclusión:

Diseñar constructores flexibles usando *args y **kwargs es una herramienta poderosa en la caja de herramientas del desarrollador de Python, especialmente cuando se trata de herencia. Al comprender y adoptar este enfoque, los desarrolladores pueden garantizar que sus clases sigan siendo flexibles y mantenibles mediante cambios e iteraciones. Como siempre, si bien la flexibilidad es beneficiosa, también es fundamental tener cuidado y garantizar que la flexibilidad no introduzca problemas no deseados.

Inglés

original

Recomendación de buen libro de IA

La IA cambia cada día que pasa, pero un edificio de gran altura no puede separarse de unos buenos cimientos. ¿Estás interesado en conocer los principios y la práctica de la inteligencia artificial? ¡No busque más! Nuestro libro sobre principios y prácticas de la IA es el recurso perfecto para cualquiera que busque conocer mejor el mundo de la IA. Escrita por destacados expertos en el campo, esta guía completa cubre todo, desde los conceptos básicos del aprendizaje automático hasta técnicas avanzadas para construir sistemas inteligentes. Ya sea usted un principiante o un practicante experimentado de IA, este libro lo tiene cubierto. Entonces, ¿por qué esperar?

Los principios y prácticas de la inteligencia artificial cubren de manera integral los clásicos de varios sistemas importantes de inteligencia artificial y ciencia de datos.

Prensa de la Universidad de Pekín, Principios y prácticas de la inteligencia artificial Inteligencia artificial y ciencia de datos desde el nivel básico hasta el dominio Explica los principios del aprendizaje automático y los algoritmos de aprendizaje profundo

Supongo que te gusta

Origin blog.csdn.net/robot_learner/article/details/132225481
Recomendado
Clasificación