Herencia de clases en Python


prefacio

  Al escribir una clase, no siempre tiene que comenzar con una pizarra en blanco. Cuando entre una clase a escribir y otra clase que ya existeHay una cierta relación de herencia.cuando puedaReutilización de código a través de la herenciaEl propósito es mejorar la eficiencia del desarrollo. Aquí se explica cómo implementar la herencia en Python .


1. La gramática básica de la herencia

  la herencia esUna de las características más importantes de la programación orientada a objetos., que se origina en el proceso de comprensión del mundo objetivo por parte de las personas, y es un fenómeno común en la naturaleza. Por ejemplo, cada uno de nosotros hereda algunas características físicas de nuestros abuelos y padres, pero cada uno de nosotros es diferente de nuestros padres porque cada uno de nosotros tiene algunas características que son únicas para nosotros y no se reflejan en nuestros padres. . Implementando la herencia en el diseño de programas, expresandoEsta clase posee todos los miembros públicos o protegidos de la clase de la que hereda. En la programación orientada a objetos,clase heredadallamada la clase padre o base ,Nueva claseLlamada subclase o clase derivada .
  por herenciaNo solo se puede reutilizar el código,Lo suficientemente bienEnderezar la relación entre clases a través de la herencia.. En Python, en la declaración de definición de clase, use un par de paréntesis en el lado derecho del nombre de la clase para encerrar el nombre de la clase base que se heredará, a fin de lograr la herencia de clase. El formato de sintaxis específico es el siguiente:

class ClassName(baseclasslist): 
	'''类的帮助信息'''  # 类文档字符串
	statement  # 类体

Descripción del parámetro :

  • ClassName : se utiliza para especificar el nombre de la clase.
  • baseclasslist : usado para especificarclase base para heredar de, puede haber más de uno, y los nombres de las clases están separados por comas ",". Si no se especifica, se utilizará el objeto de clase base de todos los objetos de Python .
  • '''Información de ayuda de la clase''' : se utiliza para especificar la cadena del documento de la clase. Después de definir la cadena, al crear el objeto de la clase, después de ingresar el nombre de la clase y el corchete izquierdo "(", la información será mostrado.
  • declaración : cuerpo de la clase, compuesto principalmente por declaraciones de definición, como variables de clase (o miembros de clase), métodos y atributos. Si no piensa en la función específica de la clase al definir la clase, también puede usar la declaración de paso directamente en el cuerpo de la clase.

  Por ejemplo, defina una clase de fruta Fruit (como clase base) y defina un atributo de clase (usado para guardar el color predeterminado de la fruta) y un método de cosecha () en esta clase, y luego cree una clase Banana y una Uva class, ambos heredados de la clase Fruit, y finalmente crear instancias de la clase Banana y la clase Grape, y llamar al método de cosecha() (escrito en la clase base), el código es el siguiente:

class Fruit:  # 定义水果类(基类)
    color = '绿色'  # 定义类属性
    def harvest(self, color):
        print('水果是{}的'.format(color))  # 输出的是形式参数color
        print('水果已经收获......')
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    color = '黄色'
    def __init__(self):
        print('我是香蕉')
class Grape(Fruit):  # 定义葡萄类(派生类)
    color = '紫色'
    def __init__(self):
        print('我是葡萄')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法
grape = Grape()  # 创建类的实例(葡萄)
grape.harvest(grape.color)  # 调用基类的harvest()方法

  Ejecutar el código anterior mostrará el resultado como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

  Se puede ver a partir de los resultados de la ejecución que, aunque no hay un método de cosecha () en la clase Banana y la clase Grape, PythonPermitir que las clases derivadas accedan a los métodos de la clase base


2. Reescritura de métodos

  Los miembros de la clase base serán heredados por la clase derivada, cuando un método en la clase baseno completamente aplicableAl usar una clase derivada, debe anular este método de la clase principal en la clase derivada .
  En el código de ejemplo anterior, el método de cosecha() definido en la clase base mostrará "fruta..." sin importar cuál sea la clase derivada, en lugar de mostrar el nombre de la fruta, como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Si desea dar diferentes sugerencias para diferentes frutas, puede anular el método de cosecha ()   en la clase derivada . el código se muestra a continuación:

class Fruit:  # 定义水果类(基类)
    color = '绿色'  # 定义类属性
    def harvest(self, color):
        print('水果是{}的'.format(color))  # 输出的是形式参数color
        print('水果已经收获......')
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    color = '黄色'
    def __init__(self):
        print('我是香蕉')
    def harvest(self, color):
        print('香蕉是{}的'.format(color))  # 输出的是形式参数color
        print('香蕉已经收获......')
        print('香蕉原来是{}的'.format(Fruit.color))  # 输出的是类属性color
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest(banana.color)  # 调用基类的harvest()方法

  Después de ejecutar el código anterior, el resultado se muestra de la siguiente manera:

我是香蕉
香蕉是黄色的
香蕉已经收获......
香蕉原来是绿色的

3. Llame al método _ _init _ _() de la clase base en la clase derivada

  Al definir el método _ _ init _ _() en una clase derivada,no invocado automáticamenteEl método _ _ init _ _() de la clase base. Por ejemplo, defina una clase Fruit, cree el color del atributo de clase en el método _ _ init _ _(), luego defina un método de cosecha() en la clase Fruit, genere el valor del color del atributo de clase en este método y luego cree la clase Class Banana, finalmente cree una instancia de la clase Banana y llame al método de cosecha (), el código es el siguiente:

class Fruit:  # 定义水果类(基类)
    def __init__(self, color = '绿色'):
        Fruit.color = color  # 定义类属性
    def harvest(self):
        print('水果原来是{}的'.format(Fruit.color))  # 输出的是类属性color
class Banana(Fruit):  # 定义香蕉类(派生类)
    def __init__(self):
        print('我是香蕉')
banana = Banana()  # 创建类的实例(香蕉)
banana.harvest()  # 调用基类的harvest()方法

  Después de ejecutar el código anterior, se mostrará la información de excepción que se muestra en la siguiente figura.

inserte la descripción de la imagen aquí

  Por lo tanto, para que la clase derivada llame al método _ _ init _ _() de la clase base para realizar la inicialización necesaria, es necesario usar la función super() en la clase derivada para llamar al método _ _ init _ _ () método de la clase base. El formato de uso es el siguiente:

super()._ _init_ _([参数1, ....])

注意:如果基类的初始化方法中有参数传入,则这里需要在 _ _init_ _() 括号中写入形式参数

  Después de agregar super()._ _ init _ _() al código anterior, el código y los resultados de la ejecución se muestran en la siguiente figura:

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/2201_75641637/article/details/129552892
Recomendado
Clasificación