Herencia orientada a objetos de Python (5)

heredar

objetivos

  • Herencia única
  • Herencia múltiple

Tres funciones orientadas a objetos

  • La encapsulación encapsula atributos y métodos en una clase abstracta de acuerdo con las responsabilidades
  • Herencia para lograr la reutilización del código, no es necesario escribir el mismo código repetidamente
  • Los diferentes objetos polimórficos llaman al mismo método, producen diferentes resultados de ejecución, aumentan la flexibilidad del código

01. Herencia única

1.1 El concepto, gramática y características de la herencia

El concepto de herencia: la clase secundaria tiene todos los métodos y propiedades de la clase principal.
Inserte la descripción de la imagen aquí

1) sintaxis heredada

class 类名(父类名):pass
  • La subclase hereda de la clase principal y puede disfrutar directamente de los métodos encapsulados en la clase principal, sin necesidad de desarrollarla nuevamente.
  • La subclase debe encapsular los atributos y métodos únicos de la subclase de acuerdo con las responsabilidades

2) Términos profesionales

  • La clase Dog es una subclase de la clase Animal, la clase Animal es la clase padre de la clase Dog, la clase Dog hereda de la clase Animal
  • La clase Dog es una clase derivada de la clase Animal, la clase Animal es la clase base de la clase Dog, la clase Dog se deriva de la clase Animal

3) Transitividad de la herencia

La Clase C hereda de la Clase B y la Clase B hereda de la Clase A, luego la Clase C tiene todas las propiedades y métodos de la Clase B y la Clase A

La clase secundaria tiene todas las propiedades y métodos encapsulados en la clase principal y la clase principal de la clase principal.

Pregunta:
¿Puede el perro gruñendo llamar al método de captura definido en la clase Cat?

Respuesta:
No, porque no existe una relación de herencia entre Snarling Dog y Cat.

1.2 Reescritura de métodos

  • La clase secundaria tiene todos los métodos y propiedades de la clase principal.
  • La subclase hereda de la clase principal y puede disfrutar directamente de los métodos encapsulados en la clase principal, sin necesidad de desarrollarla nuevamente.

Escenarios de aplicación

  • Cuando la implementación del método de la clase principal no puede satisfacer las necesidades de la subclase, el método se puede anular (anular)
    Inserte la descripción de la imagen aquí

Hay dos casos para anular el método de la clase principal:

1. Anular el método
de la clase principal 2. Ampliar el método de la clase principal

1 Anular el método de la clase padre

  • Si durante el desarrollo, la implementación del método de la clase principal y la implementación del método de la subclase son completamente diferentes,
    puede usar el método de anulación para reescribir la implementación del método de la clase principal en la subclase.
  • La implementación específica es equivalente a definir un método con el mismo nombre que la clase padre en la subclase e implementarlo
  • Después de reescribir, en tiempo de ejecución, solo se llamará al método reescrito en la subclase, y ya no se llamará al método encapsulado por la clase principal

2 Amplíe el método de la clase principal

  • Si durante el desarrollo, la implementación del método de la subclase contiene la implementación del método de la clase principal. La implementación del método
    encapsulada originalmente por la clase principal es parte del método de la subclase.
  • Puede usar el método extendido
    a, anular el método de la clase principal en la subclase,
    b, usar super () donde sea necesario, el método de la clase principal para llamar a la ejecución del método de clase principal
    c, otras ubicaciones en el código para el necesidades de la subclase, escribir implementación de código específico de la subclase

Sobre super

  • Super es una clase especial en Python
  • super () es un objeto creado usando la superclase
  • El escenario más utilizado es llamar al método encapsulado en la clase principal al reescribir el método de la clase principal.

Otra forma de llamar al método de la clase principal (conocida)
En Python 2.x, si necesita llamar al método de la clase principal, también puede usar el siguiente método:

父类名.方法(self)

Este método actualmente es compatible con Python 3.x

No se recomienda este método, porque una vez que cambia la clase principal, el nombre de la clase de la ubicación de la llamada al método también debe modificarse

Consejos
Durante el desarrollo, no mezcle el nombre de la clase principal y super ()

Si usa el nombre de la subclase actual para llamar al método, formará una llamada recursiva y un bucle infinito

1.3 Propiedades privadas y métodos privados de la clase padre

1. Los objetos de subclase no pueden acceder directamente a las propiedades privadas o métodos privados de la clase principal en sus propios métodos
2. Los objetos de subclase pueden acceder indirectamente a propiedades privadas o métodos privados a través de los métodos públicos de la clase principal.

  • Las propiedades y métodos privados son la privacidad del objeto, y no se revelan al mundo exterior y el mundo exterior y las subclases no pueden acceder directamente a ellos.

  • Las propiedades y los métodos privados se utilizan generalmente para hacer algunas cosas internas.
    Ejemplo
    Inserte la descripción de la imagen aquí

  • El objeto de B no puede acceder directamente al atributo __num2

  • El objeto de B no puede acceder al atributo __num2 en el método de demostración

  • El objeto de B puede llamar al método de prueba de la clase principal en el método de demostración

  • Dentro del método de prueba de la clase principal, puede acceder al atributo __num2 y al método __test

02. Herencia múltiple

concepto

Las subclases pueden tener varias clases principales y todas las propiedades y métodos de la clase principal.

Por ejemplo: los hijos heredarán las características de su padre y su madre
Inserte la descripción de la imagen aquí

gramática

class 子类名(父类名1, 父类名2...)
   pass

2.1 Precauciones para el uso de herencia múltiple

declaración del problema

Si hay métodos con el mismo nombre en diferentes clases principales, ¿qué método de la clase principal se llamará cuando el objeto de la subclase llame al método?

Consejo: ¡Al desarrollar, debe tratar de evitar esta situación fácilmente confusa! - si la propiedad o el método del mismo nombre existe entre la clase principal, debe evitar el uso de herencia múltiple
Inserte la descripción de la imagen aquí

MRO en el orden de búsqueda del método Python (saber)

  • Python proporciona un atributo integrado mro para que las clases vean el orden de búsqueda del método
  • MRO es el orden de resolución de métodos, que se utiliza principalmente para determinar la ruta de llamada de métodos y atributos en el caso de herencia múltiple.
print(C.__mro__)

Resultado de salida

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
  • Al buscar un método, se busca en el orden de izquierda a derecha de acuerdo con el resultado de salida de mro
  • Si se encuentra un método en la clase actual, se ejecutará directamente sin buscar
  • Si no lo encuentra, buscará si hay un método correspondiente en la siguiente clase. Si lo encuentra, se ejecutará directamente sin buscar
  • Si se encuentra la última clase, pero no se ha encontrado el método, el programa informa de un error

2.2 Estilo nuevo y estilo antiguo (clásico)

object es la clase base proporcionada por Python para todos los objetos. Proporciona algunos atributos y métodos integrados, que se pueden ver con la función dir.

Clase de nuevo estilo: una clase con objeto como clase base, recomendado

Clase clásica: la clase que no toma objeto como clase base, no se recomienda usar

Al definir una clase en Python 3.x, si no se especifica una clase principal, el objeto se utilizará como la clase base de la clase de forma predeterminada; las clases definidas en Python 3.x son todas clases de estilo nuevo

Al definir una clase en Python 2.x, si no se especifica una clase principal, el objeto no se utilizará como clase base

Las clases clásicas y de estilo nuevo en herencia múltiple afectarán el orden de búsqueda de los métodos

¡Para garantizar que el código escrito se pueda ejecutar en Python 2.xy Python 3.x al mismo tiempo!
En el futuro, al definir una clase, si no hay una clase principal, se recomienda heredar del objeto de manera uniforme

class 类名(object):
   pass

Supongo que te gusta

Origin blog.csdn.net/weixin_42272869/article/details/113572167
Recomendado
Clasificación