Red de conocimiento informático - Problemas con los teléfonos móviles - Explicación detallada de la herencia y el polimorfismo en la programación orientada a objetos de Python

Explicación detallada de la herencia y el polimorfismo en la programación orientada a objetos de Python

Explicación detallada de la herencia y el polimorfismo en la programación orientada a objetos de Python

Este artículo describe la herencia y el polimorfismo en la programación orientada a objetos de Python con ejemplos. Compártelo con todos para tu referencia, de la siguiente manera:

Herencia de clases de Python

En la programación OOP (Programación orientada a objetos), cuando definimos una clase, podemos heredar una clase existente. , la nueva clase se llama subclase (Subclase) y la clase heredada se llama clase base, clase principal o superclase (clase base, superclase).

Primero definimos una clase Persona, que representa a una persona, y define las variables de atributo nombre y sexo (nombre y género).

Definimos un método print_title(): cuando el sexo es; masculino, imprima hombre; cuando el sexo es femenino, imprima mujer. Consulte el siguiente código:

clase Persona(objeto):

def __init__(self,nombre,sexo):

self.name = nombre

self.sex = sexo

def print_title(self):

if self.sex == "masculino":

print(" man" )

elif self.sex == "female":

print("mujer")

class Niño(Persona): # El niño hereda la Persona

pase

Mayo = Niño("Mayo","mujer")

Pedro = Persona("Pedro","hombre")

print(May.name,May.sex,Peter.name,Peter.sex) # La subclase hereda los métodos y atributos de la clase padre

May.print_title()

Peter.print_title ()

Cuando escribimos la clase Child, podemos heredar completamente la clase Person (Child es Person); use la clase subclass_name(baseclass_name) para expresar herencia;

¿Cuáles son los beneficios de la herencia? El mayor beneficio es que la subclase obtiene todos los atributos y funciones de la clase principal. Como se muestra a continuación, la clase Child puede usar directamente el método print_title() de la clase principal

Al crear una instancia de Child, la subclase hereda el constructor de la clase principal y necesita proporcionar los dos nombres de variables de atributos requeridos por la clase padre Persona. Y sexo:

En una relación de herencia, si el tipo de datos de una instancia es una subclase, también puede considerarse como una clase padre (May es tanto Niño como Persona). Sin embargo, lo contrario no es cierto (Pedro es sólo una Persona, no un Niño).

La herencia también se puede transmitir nivel por nivel, al igual que la relación de abuelo a padre a hijo. En última instancia, cualquier clase puede rastrearse hasta el objeto de clase raíz. Estas relaciones de herencia parecen un árbol invertido. Por ejemplo, el siguiente árbol de herencia:

isinstance() e issubclass()

La diferencia entre Python y otros lenguajes es que cuando definimos una clase, en realidad definimos una tipo de datos.

Los tipos de datos que definimos no son diferentes de los tipos de datos que vienen con Python, como str, list y dict.

Python tiene dos funciones para determinar la herencia: isinstance() se usa para verificar los tipos de instancias; issubclass() se usa para verificar la herencia de clases. Vea el siguiente ejemplo:

clase Persona(objeto):

pasar

clase Niño(Persona): # El niño hereda la Persona

pasar

Mayo = Niño()

Peter = Persona()

print(isinstance(Mayo,Niño)) # Verdadero

print (isinstance(May,Persona)) # Verdadero

print(isinstance(Peter,Niño)) # False

print(isinstance(Peter,Persona)) # Verdadero

print(issubclass(Child,Person)) # True

Polimorfismo de las clases de Python

Antes de explicar qué es el polimorfismo, reescribimos print_title( en la clase Child ) Método: si es hombre, escriba niño; si es mujer, escriba niña

clase Persona(objeto):

def __init__(self,nombre,sexo):

self.name = nombre

self.sex = sexo

def print_title(self):

if self.sex == "masculino":

print("hombre")

elif self.sex == "femenino":

print("mujer")

clase Niño(Persona): # El niño hereda la Persona

def print_title(self):

if self.sex == "masculino":

print(" niño ")

elif self.sex == "femenino":

print("niña")

Mayo = Niño("Mayo","femenino " )

Peter = Persona("Peter","masculino")

print(May.nombre,May.sexo,Peter.nombre,Peter.sex)

May.print_title()

Peter.print_title()

Cuando existe el mismo método print_title() tanto en la subclase como en la clase principal, el print_title() de la subclase overrides Cuando el código se esté ejecutando, se llamará print_title() de la subclase. De esta manera, obtenemos otro beneficio de la herencia: el polimorfismo.

La ventaja del polimorfismo es que cuando necesitamos pasar más subclases, como agregar Adolescentes, Adultos, etc., solo necesitamos heredar el tipo Persona, y el método print_title() puede Sin reescribir (incluso usando Persona), también puedes reescribir uno único. Esto es lo que significa polimorfismo. La persona que llama solo se preocupa por la llamada, independientemente de los detalles. Cuando agregamos una nueva subclase de Persona, solo necesitamos asegurarnos de que el nuevo método esté escrito correctamente, independientemente del código original.

Este es el famoso principio de "abierto y cerrado":

Abierto para extensión: permite que las subclases anulen las funciones del método

Cerrado para modificación: no reescribir, hereda directamente la función del método de la clase principal

La subclase reescribe el constructor

La subclase no puede tener constructor, lo que significa que la estructura es consistente con la clase principal. La subclase también puede anular la función constructora ahora, necesitamos agregarla; dos nuevas variables de atributo en la subclase Niño: madre y padre. Podemos construirlas de la siguiente manera (se recomienda que la subclase llame al método de construcción de la clase padre, consulte el código siguiente):

clase Persona. (objeto):

def __init__(self,nombre,sexo):

self.name = nombre

self.sex = sexo

clase Niño(Persona): # Niño hereda Persona

def __init__(self,nombre,sexo,madre,padre):

self.name = nombre

self.sexo = sexo

self.madre = madre

self.padre = padre

Mayo = Niño("Mayo","mujer", "Abril","Junio")

print(mayo.nombre,mayo.sexo,mayo.madre,mayo.padre)

Si el constructor de la clase principal contiene muchos atributos, el La subclase solo necesita agregar 1 o 2 nuevos, y habrá mucho código redundante. Aquí, la subclase puede llamar al método de construcción de la clase principal. La referencia es la siguiente:

clase Persona. (objeto) :

def __init__(self,nombre,sexo):

self.name = nombre

self.sex = sexo

clase Niño(Persona): # Niño hereda Persona

def __init__(self,nombre,sexo,madre,padre):

Persona.__init__(self,nombre,sexo) #Subclase Llamando al constructor de la clase padre

self.mother = mother

self.father = padre

May = Child("May","female " ,"Abril","Junio")

imprimir(mayo.nombre,mayo.sexo,mayo.madre,mayo.padre)

Herencia múltiple

El concepto de herencia múltiple debería ser relativamente fácil de entender. Por ejemplo, ahora necesitamos crear una nueva clase baby que herede Child. Puede heredar las propiedades y métodos de la clase principal y la clase superior de la clase principal. se proporciona al método con la clase de capa más cercana. La referencia del código es la siguiente:

clase Persona(objeto):

def __init__(self,nombre,sexo):

p>

self.name = nombre

self.sex = sexo

def print_title(self):

if self.sex == "masculino ":

imprimir("hombre")

elif self.sex == "female":

print("mujer")

clase Niño(Persona):

pase

clase Bebé(Niño):

pasar

Mayo = Bebé("May","female") # Hereda los atributos de la clase padre superior

print(May.name,May.sex)

May.print_title() # Puedes usar el método de la clase principal superior

clase Child(Persona):

def print_title(self):

if self.sex == "masculino":

print("niño")

elif self.sex == "female":

print("niña")

clase Bebé(Niño):

pasar

Mayo = Bebé ("May","female")

May.print_title() # Priorizar usando el método de clase superior