Aprendizaje de Python (12) -herencia

Tabla de contenido

1. Mecanismo de herencia

2. La clase principal reescribe

(1) función super ()

(2) __ ranuras__

(3) tipo () función

(4) Metaclase MetaClass

3. Polimorfismo


1. Mecanismo de herencia

El mecanismo de herencia se usa a menudo para crear nuevas clases con funciones similares a las clases existentes, o las nuevas clases solo necesitan agregar algunos miembros (atributos y métodos) a la clase existente, pero no quieren copiar directamente el código de la clase existente a la nueva. clase .clase. En otras palabras, utilizando el mecanismo de herencia, la reutilización de clases se puede lograr fácilmente.

Deje que la clase From herede la clase Shape, de modo que cuando el objeto de la clase From llame al método draw (), el intérprete de Python buscará primero el método llamado dibujar en From, y si no puede encontrarlo, buscará automáticamente para ello en la clase Shape. De esta forma, solo necesitamos agregar un método para calcular el área en la clase De. El código de muestra es el siguiente:

class Shape:
    def draw(self,content):
        print("画",content)
class Form(Shape):
    def area(self):
        #....
        print("此图形的面积为...")

En el código anterior, la clase From (Shape) significa que From hereda Shape. En Python, una clase que implementa la herencia se llama subclase y la clase heredada se llama clase padre (también llamada clase base o superclase). Entonces, en el ejemplo anterior, From es la subclase y Shape es la superclase.
Cuando una subclase hereda una clase principal, solo necesita poner la clase principal (puede haber varias) entre paréntesis después de la subclase al definir la subclase. El formato de sintaxis es el siguiente:

class Nombre de clase (clase principal 1, clase principal 2, ...):
       # Parte de definición de clase

Tenga en cuenta que si la clase no especifica explícitamente de qué clase hereda, heredará la clase de objeto de forma predeterminada (la clase de objeto es la clase principal de todas las clases en Python, es decir, es una clase principal directa o indirecta clase de padres). Además, la herencia de Python es un mecanismo de herencia múltiple (   igual que C ++ ), es decir, una subclase puede tener varias clases principales directas al mismo tiempo. Es posible que algunos lectores también hayan oído hablar del término "derivación", que significa lo mismo que herencia, pero tiene una perspectiva diferente. En otras palabras, la herencia es relativa a la clase secundaria, es decir, la clase secundaria hereda de la clase principal; y la derivación es relativa a la clase principal, es decir, la clase principal deriva la clase secundaria. De hecho, la mayoría de los lenguajes de programación orientados a objetos solo admiten herencia única, es decir, las subclases solo pueden tener una clase principal. Python admite herencia múltiple (C ++ también admite herencia múltiple). En comparación con la herencia única, la herencia múltiple tiende a hacer que la lógica del código sea complicada y confusa. Siempre ha sido controvertida. Rara vez se usa en proyectos pequeños y medianos. Más tarde,  Java , C # , PHP,  etc. simplemente cancelaron la herencia múltiple.

El problema al que se enfrenta a menudo con el uso de herencia múltiple es que varias clases principales contienen métodos de clase con el mismo nombre. En este caso, las medidas de tratamiento de Python son: de acuerdo con el orden de la clase principal cuando la clase secundaria hereda varias clases principales, es decir, el método de clase en la clase principal anterior anulará el método de clase del mismo nombre en la siguiente clase principal clase.

2. La clase principal reescribe

La clase secundaria hereda la clase principal, luego la clase secundaria tiene todos los atributos de clase y métodos de clase de la clase principal. En circunstancias normales, las subclases ampliarán algunos atributos de clase nuevos y métodos de clase sobre esta base. , Podemos encontrarnos con una situación de este tipo, es decir, la mayoría de los métodos de clase heredados por la subclase de la clase principal son adecuados para que los use la subclase, pero hay métodos de clase individuales que no se pueden copiar directamente de la clase principal. Si no modificando esta parte de los métodos de la clase, los objetos de la subclase no se pueden utilizar. En respuesta a esta situación, necesitamos repetir el método de la clase principal en la clase secundaria.

La reescritura, a veces llamada sobreescritura, es un significado que se refiere a modificar la implementación interna de un método existente en una clase. De hecho, si anulamos el método de clase heredado de la clase principal en la subclase, cuando se llame al método desde el objeto de la subclase fuera de la clase, Python siempre ejecutará el método anulado en la subclase. Una clase en Python se puede considerar como un espacio independiente, y un método de clase en realidad se deriva de una función en ese espacio. Si desea llamar a una función en el espacio de clases en el espacio global, solo necesita anotar el nombre de la clase al llamar a la función.

# coding=gbk
class child:
    def __init__(self):
      pass
    
    def behavior(self):
       print("小孩在玩!")

class person:
    def __init__(self):
      pass

    def behavior(self):
        print("这人在吃饭!")

class student1(child,person):
    pass

class student2(child,person):
   def behavior(self):
       print("这人在学习!")

LiMing = student1()
LiMing.behavior()
LiMing = student2()
LiMing.behavior()

La salida es:

(1) función super ()

En el método de construcción de la subclase, hay dos formas de llamar al método de construcción de la clase principal, a saber:

  1. La clase se puede considerar como un espacio independiente, y el método de instancia que contiene se puede llamar desde el exterior de la clase, al igual que la función ordinaria, pero es necesario agregar el nombre de la clase (este método también se denomina método independiente) ;
  2. Utilice la función super (). Pero si se trata de una herencia múltiple, la función solo puede llamar al constructor de la primera clase principal directa.

En Python 3.x, la función super () tiene un formato de sintaxis más simple. Se recomienda utilizar este formato:

super () .__ init __ (self, ...)

(2) __ ranuras__

Es muy flexible agregar propiedades o métodos dinámicamente a objetos de clase o instancia. Pero al mismo tiempo, si se usa indiscriminadamente, también traerá ciertos peligros ocultos al programa, es decir, las clases que se han definido en el programa se pueden modificar dinámicamente sin ninguna restricción. Afortunadamente, Python proporciona el atributo __slots__, que puede evitar que los usuarios agreguen con frecuencia atributos o métodos a los objetos de instancia de forma dinámica.

Tenga en cuenta que __slots__ solo se puede restringir a agregar propiedades y métodos dinámicamente a objetos de instancia, pero no se puede restringir a agregar propiedades y métodos dinámicamente a las clases. Para los métodos agregados dinámicamente, __slots__ restringe el nombre del método y no limita el número de parámetros.

(3) tipo () función

La función type () es una función   incorporada de Python , que generalmente se usa para ver el tipo específico de una variable. De hecho, existe un uso más avanzado de la función type (), que consiste en crear un tipo personalizado (es decir, crear una clase).

Hay dos formatos gramaticales para la función type (), que son los siguientes:

type (obj) ; type (nombre, bases, dict)

En los dos formatos gramaticales anteriores, el significado y la función de cada parámetro son:

  • El primer formato de sintaxis se utiliza para ver el tipo específico de una variable (objeto de clase) y obj representa una variable o un objeto de clase.
  • El segundo formato de sintaxis se usa para crear una clase, donde name representa el nombre de la clase; bases representa una tupla, que almacena la clase padre de la clase; dict representa un diccionario que se usa para representar los atributos o métodos definidos en el clase.

Tenga en cuenta que la sintaxis de la tupla de Python estipula que cuando solo hay un elemento en la tupla (objeto,), no se puede omitir la última coma (,). , ¿Cómo determinar si el método o atributo se agrega al diccionario de dictados? Muy simple, si el valor en el par clave-valor es una variable común (como "Red de idioma chino en C"), significa que se ha agregado un atributo de clase a la clase; por el contrario, si el valor es externo función definida, significa que la clase ha sido agregada Un método de instancia.

(4) Metaclase MetaClass

MetaClass La metaclase es esencialmente una clase, pero su uso es diferente al de las clases ordinarias y puede modificar dinámicamente las definiciones dentro de la clase (incluidos los atributos de clase y los métodos de clase). Se puede decir que el propósito principal de usar metaclases es cambiar dinámicamente las propiedades o métodos definidos en la clase cuando se crea la clase. Si desea utilizar la metaclase MetaClass para modificar dinámicamente las propiedades o métodos internos al crear una clase, el proceso de creación de la clase se volverá complicado: primero cree la metaclase MetaClass, luego use la metaclase para crear la clase y finalmente use la instancia de la clase El objeto realiza la función.

Si desea diseñar una clase como una metaclase MetaClass, debe cumplir las siguientes condiciones:

  1. Debe heredar explícitamente de la clase de tipo;
  2. La clase necesita definir e implementar el método __new __ (), que debe devolver un objeto de instancia de la clase, porque cuando se usa una metaclase para crear una clase, el método __new __ () se ejecutará automáticamente para modificar la clase recién creada.

Al crear una clase, al marcar la clase padre mientras se especifica la metaclase (en el formato metaclass=元类名), cuando el   intérprete de Python crea esta clase, se llamará al método __new__ en la metaclase FirstMetaClass, realizando así la modificación dinámica de la clase El propósito de la atributo o método de clase.

3. Polimorfismo

Python  es un lenguaje de tipo débil y su característica más obvia es que cuando se utilizan variables, no es necesario especificar tipos de datos específicos para ellas. Esto conduce a una situación en la que la misma variable puede asignarse a diferentes objetos de clase uno tras otro.

Las características polimórficas de la clase deben cumplir los siguientes dos requisitos previos:

  1. Herencia: El polimorfismo debe ocurrir entre la clase secundaria y la clase principal;
  2. Reescribir: la subclase reescribe el método de la clase principal.

Supongo que te gusta

Origin blog.csdn.net/qq_35789421/article/details/113625931
Recomendado
Clasificación