Herencia de clases de python3

1. Definición de herencia

La herencia es una forma de crear una nueva clase. En Python, una nueva clase puede heredar una o más clases principales.

2. Herencia única y herencia múltiple

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

Ver herencia

>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

Sugerencia : si no se especifica una clase base, la clase de Python heredará la clase de objeto de forma predeterminada. Object es la clase base de todas las clases de Python, que proporciona la implementación de algunos métodos comunes (como __str__).

>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)

3. Herencia y abstracción (primero abstracción y luego herencia)

La abstracción consiste en extraer partes similares o más similares.

Hay dos niveles de abstracción:

Extraiga las partes similares de Obama y Messi en clases;

Extraiga las partes similares de las tres clases de personas, cerdos y perros como la clase principal.

La función principal de la abstracción es dividir categorías (lo que puede aislar preocupaciones y reducir la complejidad).
Por favor agregue la descripción de la imagen
Herencia : se basa en el resultado de la abstracción. Para lograrlo a través de un lenguaje de programación, primero debe pasar por el proceso de abstracción antes de que pueda expresar la abstracción a través de la herencia.Estructura.

La abstracción es solo una acción o una habilidad en el proceso de análisis y diseño, a través de la abstracción se pueden obtener clases
Por favor agregue la descripción de la imagen
4. Herencia y reutilización

primera parte

P.ej

Los gatos pueden: maullar, comer, beber, jalar, rociar

Los perros pueden: ladrar, comer, beber, jalar, rociar

Si queremos crear una clase para gato y perro respectivamente, entonces necesitamos implementar todas sus funciones para gato y perro, el pseudocódigo es el siguiente:

#猫和狗有大量相同的内容
class 猫:

    def 喵喵叫(self):
        print '喵喵叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

class 狗:

    def 汪汪叫(self):
        print '汪汪叫'

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

la segunda parte

No es difícil ver en el código anterior que comer, beber, tirar y tirar son funciones que tienen tanto los perros como los gatos, pero las hemos escrito dos veces en nuestras clases separadas de perros y gatos. Si se utiliza la idea de herencia, se implementa de la siguiente manera:

Animales: comer, beber, tirar, rociar

Gatos: Miau (los gatos heredan funciones de los animales)

Perro: ladrar (los perros heredan las funciones de los animales)

El pseudocódigo es el siguiente:

class 动物:

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

    def 喵喵叫(self):
        print '喵喵叫'
        
# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

    def 汪汪叫(self):
        print '汪汪叫'

la tercera parte

#继承的代码实现
class Animal:

    def eat(self):
        print("%s 吃 " %self.name)

    def drink(self):
        print ("%s 喝 " %self.name)

    def shit(self):
        print ("%s 拉 " %self.name)

    def pee(self):
        print ("%s 撒 " %self.name)


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = '猫'

    def cry(self):
        print('喵喵叫')

class Dog(Animal):

    def __init__(self, name):
        self.name = name
        self.breed='狗'

    def cry(self):
        print('汪汪叫')


# ######### 执行 #########

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()

Buen ejemplo de uso de herencia para reutilizar código.

En el proceso de desarrollo de un programa, si definimos una clase A y luego queremos crear otra clase B, pero la mayor parte del contenido de la clase B es el mismo que el de la clase A

No podemos escribir una clase B desde cero, que utiliza el concepto de herencia de clase.

Cree una nueva clase B por herencia, deje que B herede A, y B 'heredará' todos los atributos (atributos de datos y atributos de funciones) de A para lograr la reutilización del código

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:660193417
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()

Sugerencia: use una clase existente para crear una nueva clase, que reutiliza una parte del software existente y la mayoría de las configuraciones, lo que aumenta considerablemente la carga de trabajo de programación. Esto a menudo se denomina reutilización de software. No solo puede reutilizar sus propias clases También puede heredar de otros, como bibliotecas estándar, para personalizar nuevos tipos de datos, lo que acorta en gran medida el ciclo de desarrollo de software y es de gran importancia para el desarrollo de software a gran escala.

5. Derivación de clases

Por supuesto, las subclases también pueden agregar sus propios atributos nuevos o redefinir estos atributos por sí mismos (no afectará a la clase principal).Cuando se trata de propiedades, depende de usted.

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    '''
    狗类,继承Animal类
    '''
    def bite(self, people):
        '''
        派生:狗有咬人的技能
        :param people:  
        '''
        people.life_value -= self.aggressivity

class Person(Animal):
    '''
    人类,继承Animal
    '''
    def attack(self, dog):
        '''
        派生:人有攻击的技能
        :param dog: 
        '''
        dog.life_value -= self.aggressivity

egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
print(ha2.life_value)
print(egg.attack(ha2))
print(ha2.life_value)

Nota : las referencias de atributos como ha2.life_value primero buscarán life_value en la instancia, luego en la clase y luego en la clase principal... hasta la clase principal de nivel superior.

En la subclase, el atributo de función recién creado con el mismo nombre, al editar la función en la función, puede ser necesario reutilizar la función función del mismo nombre en la clase principal, que debería ser la forma de llamar a la función ordinaria , a saber: classname.func (), en este punto no es diferente de llamar a una función normal, por lo que incluso al parámetro self se le debe pasar un valor.

En python3, el método de la subclase que ejecuta la clase principal también puede usar el método super directamente
.

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:660193417
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:
    def hahaha(self):
        print('A')

class B(A):
    def hahaha(self):
        super().hahaha()
        #super(B,self).hahaha()
        #A.hahaha(self)
        print('B')

a = A()
b = B()
b.hahaha()
super(B,b).hahaha()

(2) Batalla hombre-perro

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    '''
    狗类,继承Animal类
    '''
    def __init__(self,name,breed,aggressivity,life_value):
        super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
        self.breed = breed  #派生出了新的属性

    def bite(self, people):
        '''
        派生出了新的技能:狗有咬人的技能
        :param people:  
        '''
        people.life_value -= self.aggressivity

    def eat(self):
        # Animal.eat(self)
        #super().eat()
        print('from Dog')

class Person(Animal):
    '''
    人类,继承Animal
    '''
    def __init__(self,name,aggressivity, life_value,money):
        #Animal.__init__(self, name, aggressivity, life_value)
        #super(Person, self).__init__(name, aggressivity, life_value)
        super().__init__(name,aggressivity, life_value)  #执行父类的init方法
        self.money = money   #派生出了新的属性

    def attack(self, dog):
        '''
        派生出了新的技能:人有攻击的技能
        :param dog: 
        '''
        dog.life_value -= self.aggressivity

    def eat(self):
        #super().eat()
        Animal.eat(self)
        print('from Person')

egg = Person('egon',10,1000,600)
ha2 = Dog('二愣子','哈士奇',10,1000)
print(egg.name)
print(ha2.name)
egg.eat()

La relación entre la clase derivada y la clase base se establece a través de la herencia, es una relación de 'sí', como un caballo blanco es un caballo y una persona es un animal.

Cuando hay muchas funciones comunes entre clases, es mejor usar la herencia para extraer estas funciones comunes y convertirlas en clases base.Por ejemplo, un profesor es un maestro.

>>> class Teacher:
...     def __init__(self,name,gender):
...         self.name=name
...         self.gender=gender
...     def teach(self):
...         print('teaching')
... 
>>> 
>>> class Professor(Teacher):
...     pass
... 
>>> p1=Professor('egon','male')
>>> p1.teach()

Supongo que te gusta

Origin blog.csdn.net/m0_67575344/article/details/124150648
Recomendado
Clasificación