Python - orientado a objetos

(1) Conocer la orientación a objetos

      Python adopta por completo la idea de la orientación a objetos, es un lenguaje de programación orientado a objetos real, admite completamente las funciones básicas de la orientación a objetos, tales como: herencia, polimorfismo, encapsulación, etc. Python admite múltiples paradigmas .
   En Python , todo es un objeto. Los tipos de datos, funciones, etc. que aprendimos anteriormente son todos objetos.
caracteristicas orientadas a objetos 
   La idea de la programación orientada a objetos ( Object oriented Programming , OOP ) está pensada principalmente para software a gran escala.
   La programación orientada a objetos hace que el programa sea más extensible y legible, lo que hace que la programación sea tan fácil como construir bloques.
    La programación orientada a objetos encapsula datos y métodos relacionados con la operación de datos en objetos, y la forma de organizar el código y los datos está más cerca del pensamiento humano, lo que mejora en gran medida la eficiencia de la programación.
La diferencia entre procedimental y orientado a objetos
       Orientado a procesos y orientado a objetos son ideas de análisis, diseño y desarrollo de software , que guían a las personas a analizar, diseñar y desarrollar software de diferentes maneras. El lenguaje C es un lenguaje típico orientado a procesos, y Java es un lenguaje típico orientado a objetos.
¿Qué está orientado a procesos?
Orientado a procesos es adecuado para transacciones simples, no cooperativas, centrándose en cómo ejecutar. Cuando estamos orientados a procesos, primero pensamos en "¿ cómo implementarlo paso a paso?". Por ejemplo, ¿cómo conducir? Podemos enumerar fácilmente los pasos de implementación:
Pero cuando pensamos en tareas de diseño más complejas, como "¿ cómo construir un automóvil? " , encontraremos que es imposible enumerar pasos como 1234 . Esto se debe a que construir un automóvil es demasiado complicado y requiere mucha colaboración para completarlo. En este momento, surgió el pensamiento orientado a objetos.

¿Qué es orientado a objetos?
     El pensamiento orientado a objetos (Oriented-Object) está más en línea con el modo de pensamiento de las personas. Lo primero que pensamos es "¿ cómo diseñar esta cosa? " . Por ejemplo, al pensar en construir un automóvil, primero pensaremos en "¿ cómo diseñar un automóvil?" en lugar de " cómo construir un automóvil paso a paso " . Este es un cambio de mentalidad. Naturalmente, empezamos a pensar en " de qué está hecho un coche ": coche: carrocería, motor, acelerador, volante...
   Para cooperar, encontramos una fábrica de neumáticos para completar los pasos de fabricación de neumáticos y una fábrica de motores para completar los pasos de fabricación de motores; de esta manera, descubrimos que todos pueden fabricar automóviles al mismo tiempo y finalmente ensamblarlos. , lo que mejora en gran medida la eficiencia. Específico para una operación de línea de montaje en una fábrica de neumáticos, todavía hay pasos, ¡y todavía es inseparable del ejecutor y está orientado al proceso!
        La orientación a objetos puede ayudarnos a comprender y analizar todo el sistema desde una perspectiva macro. Sin embargo, cuando se trata de las microoperaciones de la parte de implementación (es decir, cada método), aún debe manejarse de manera orientada al proceso.
Resumen orientado a objetos y orientado a procesos
1
Ambas son formas de pensar para resolver problemas, y ambas son formas de organización del código.
2
Orientado a procesos es una especie de " pensamiento del ejecutante " , para resolver problemas simples puede usar orientado a procesos
3
Orientado a objetos es una especie de " pensamiento de diseñador " . Para resolver problemas complejos y colaborativos, puede utilizar
La orientación a objetos no se puede separar de la orientación a procesos:
Macroscópicamente: diseño general a través de orientación a objetos
Micro: ejecutar y procesar datos, todavía orientado al proceso

(2) Objeto

 
A medida que los problemas a los que se enfrenta la programación se vuelven cada vez más complejos, el propio lenguaje de programación también evoluciona. Partiendo principalmente del procesamiento de datos simples, las " matrices "     evolucionan a medida que aumentan los datos; los tipos de datos se vuelven más complejos y las " estructuras " evolucionan ; el procesamiento de datos El método y la lógica se vuelven más complicados y los "objetos" evolucionan .
    datos simples
       Números como 30, 40 , 50,4 , etc. pueden considerarse datos simples. Los primeros programas de computadora fueron programados con números como este.
2
Matrices en lenguaje    C
     Agrupar datos del mismo tipo juntos. Por ejemplo: matriz de enteros [20,30,40] , matriz de coma flotante [10.2, 11.3, 12.4] , matriz de cadenas: ["aa", "bb", "cc"] , anterior [20,30,40] No una lista en python , pero una matriz en C
3
Estructuras en lenguaje    C
 Juntar diferentes tipos de datos es una estructura de datos en lenguaje C. Por ejemplo:
struct resume{
    int age;
    char name[10];
    double value;
};

4

   objeto
Unir diferentes tipos de datos y métodos (es decir, funciones) es un objeto. Por ejemplo:
class Student:
    company = "SXT"     #类属性
    count = 0           #类属性

    def __init__(self,name,score):
        self.name = name         #实例属性
        self.score = score
        Student.count = Student.count+1
    def say_score(self):           #实例方法
        print("我的公司是:",Student.company)
        print(self.name,'的分数是:',self.score)

estructura de memoria completa del objeto

      Las clases son abstractas, también conocidas como " plantillas de objetos " . Necesitamos crear un objeto de instancia de la clase a través de la plantilla de la clase, y luego podemos usar las funciones definidas por la clase. Dijimos anteriormente que un objeto de Python contiene tres partes: id ( código de identificación de identidad ), tipo (tipo de objeto), valor (valor del objeto). Podemos ir un paso más allá y decir que un objeto de Python consta de las siguientes partes:

(3) Definición de clase

     Una clase se puede considerar como una plantilla o un dibujo, y el sistema crea objetos de acuerdo con la definición de la clase. Queremos construir un automóvil, ¿cómo construirlo? La clase es este dibujo, que especifica la información detallada del automóvil, y luego el automóvil se construye de acuerdo con el dibujo.
      Clase: Lo llamamos clase . Objeto: Lo llamamos objeto , instancia ( instancia ) . En el futuro, un objeto de cierta clase es una instancia de cierta clase. Significa lo mismo.

propiedades y métodos

     Definimos las propiedades (datos) y los métodos (comportamiento) de los tipos de datos a través de clases , es decir, " comportamiento y estado del paquete de clases juntos " .

       Un objeto es una entidad concreta de una clase, generalmente llamada " instancia de una clase " . La clase se considera como un " molde de galletas " , y el objeto es la " galleta " fabricada de acuerdo con este " molde " .
       Cuando los objetos se crean a partir de una clase, cada objeto comparte el comportamiento de la clase (métodos definidos en la clase), pero tiene sus propios valores de propiedad (sin estado compartido). Para ser más específicos: " el código del método se comparte, los datos de propiedad no" .
   Tome la clase de estudiantes como ejemplo.

 En Python , " todo es un objeto " . Una clase también se denomina " objeto de clase " , y una instancia de una clase también se denomina " objeto de instancia " .

La sintaxis para definir una clase es la siguiente:
clase   nombre de clase:
        cuerpo de clase
Los puntos principales son los siguientes:
  •   Los nombres de las clases deben ajustarse a las reglas de los " identificadores " ; por lo general, la primera letra se escribe en mayúscula y las palabras múltiples usan el " principio de mayúsculas y minúsculas " .

  •   En el cuerpo de la clase podemos definir propiedades y métodos.

  • Los atributos se usan para describir datos y los métodos ( es decir, funciones ) se usan para describir operaciones relacionadas con estos datos.

Una definición de clase típica:

 class Student:
     def __init__(self,name,score): #构造方法第一个参数必须为self
          self.name = name   #实例属性
          self.score = score
     def say_score(self):  #实例方法
          print("{0}的分数是{1}".format(self.name,self.score))
          s1 = Student('王老五',80) #s1是实例对象,自动调用__init__()方法
          s1.say_score()

    pass es una declaración vacía. Significa no hacer nada, solo existir como marcador de posición. Cuando escribe código, si no sabe qué agregar a un método o clase, puede usar pass para completar el espacio primero y luego agregarlo más tarde.

Constructor __init__ y método __new__

    Para inicializar el objeto, necesitamos definir el método constructor __init__() . El método de construcción se utiliza para realizar el " trabajo de inicialización del objeto de instancia " , es decir, después de crear el objeto, las propiedades relevantes del objeto actual se inicializan y no hay valor de retorno.
Los puntos principales de __init__() son los siguientes:
  •  El nombre es fijo y debe ser: __init__()

  •  El primer parámetro es fijo y debe ser: self . self se refiere al objeto de instancia recién creado

  • Los constructores generalmente se usan para inicializar atributos de instancia de objetos de instancia, el siguiente código es para inicializar atributos de instancia: nombre y puntaje

    def __init__(self,name,score):
            self.name = name         #实例属性
            self.score = score
  • Llame al constructor por " nombre de clase ( lista de argumentos )" . Después de llamar, devuelva el objeto creado a la variable correspondiente.
  • Método __init__() : inicializa el objeto creado, la inicialización se refiere a: " asignar valor al atributo de instancia"
  • Método __new__() : se usa para crear objetos, pero generalmente no necesitamos redefinir este método
  • Si no definimos el método __init__ , el sistema proporcionará un método __init__ predeterminado .
    Si definimos un método __init__ con parámetros , el sistema no crea un método __init__ por defecto
El self en         Python es equivalente al self pointer en C++ , y la palabra clave this en JAVA y C# . En Python , self debe ser el primer parámetro del constructor, y el nombre puede modificarse arbitrariamente. Pero la práctica general se llama autoservicio.

 propiedades de instancia y métodos de instancia

atributo de instancia
Los atributos de instancia son atributos que pertenecen a objetos de instancia, también conocidos como " variables de instancia " . Su uso tiene los siguientes puntos clave:
 
Los atributos de instancia generalmente se definen mediante el siguiente código en el método __init__() :
self.nombre de atributo de instancia = valor inicial 
En otros métodos de instancia de esta clase, también se accede a través de self :
nombre de atributo self.Instance
3
Después de crear el objeto de instancia, acceda a él a través del objeto de instancia:
obj01 = nombre de clase () #Crear e inicializar objetos, llamar a __init__() para inicializar atributos
obj01.Instancia atributo nombre = valor #Puede asignar valores a los atributos existentes, o agregar nuevos atributos
class Student:
    def __init__(self,name,score):
        self.name = name #增加name属性
        self.score = score #增加score属性
    def say_score(self):
        self.age = 18     #增加age属性
        print("{0}的分数是{1}".format(self.name,self.score))
s1 = Student("张三",80)
s1.say_score()
print(s1.age)
s1.salary = 3000 #s1对象增加salary属性
s2 = Student("李四",90)
s2.say_score()
print(s2.age)

método de instancia
Un método de instancia es un método que pertenece a un objeto de instancia. El formato de definición de un método de instancia es el siguiente:
def   nombre del método ( self [, lista de parámetros ]) :
        cuerpo funcional
El formato de llamada del método es el siguiente:
Object.MethodName([Lista de argumentos])
Puntos principales:
  Al definir un método de instancia, el primer parámetro debe ser self . Como antes, self se refiere al objeto de instancia actual.
  Al llamar a un método de instancia, no necesita ni puede pasar parámetros a self . self es pasado automáticamente por el intérprete
La diferencia entre funciones y métodos.
   Todos son bloques de instrucciones que se utilizan para completar una función y son esencialmente lo mismo.
   Cuando se llama al método, se llama a través del objeto. Los métodos pertenecen a objetos de instancia específicos, las funciones ordinarias no tienen esta característica
   Intuitivamente, la definición del método necesita pasar self , la función no necesita
La esencia de la llamada al método del objeto de instancia.

otras operaciones
dir(obj) puede obtener todas las propiedades y métodos del objeto
1
obj.__dict__ diccionario de atributos del objeto
2
pasar declaración vacía
3
isinstance (objeto, tipo) para determinar si el " objeto " es " tipo especificado "

(4) Objetos de clase, atributos de clase, métodos de clase, métodos estáticos

objeto de clase

    En el formato de definición de clase que mencionamos anteriormente, class nombre de clase: . De hecho, cuando el intérprete ejecuta la declaración de clase, crea un objeto de clase
    Código específico:
class Student:
    pass  #空语句
print(type(Student))
print(id(Student))

Stu2 = Student
s1 = Stu2()
print(s1)

Efecto específico:

      Como puede verse en la figura, en realidad se genera un objeto cuyo nombre de variable es el nombre de clase Student . También podemos implementar llamadas relacionadas asignando valores a la nueva variable Stu2 . Tenga en cuenta que el " objeto de clase " se crea de hecho .

atributo de clase

    Un atributo de clase es un atributo que pertenece a un " objeto de clase " , también conocido como " variable de clase " . Porque los atributos de clase pertenecen a objetos de clase y pueden ser compartidos por todos los objetos de instancia.
Cómo se definen los atributos de clase:
clase   nombre de clase:
        nombre de variable de clase = valor inicial
En la clase o fuera de la clase, podemos leer y escribir a través de: nombre de la clase nombre de la variable de la clase

Proceso de creación de objeto de instancia de análisis de memoria y objeto de clase

Tomemos como ejemplo el siguiente código para analizar todo el proceso de creación, el código es el siguiente:
class Student:
     company = "仁和堂"  # 类属性
     count = 0 # 类属性
     def __init__(self, name, score):
          self.name = name  # 实例属性
          self.score = score
          Student.count = Student.count + 1

     def say_score(self):  # 实例方法
          print("我的公司是:", Student.company)
          print(self.name, '的分数是:',self.score)

s1 = Student('李白', 80)  # s1是实例对象,自动调用__init__()方法
s2 = Student('张三', 70)
s1.say_score()
print('一共创建{0}个Student对象'.format(Student.count))

método de clase

  Un método de clase es un método que pertenece a un " objeto de clase " . Los métodos de clase están definidos por el decorador @classmethod en el siguiente formato:
 
@métodoclase
  nombre del método de clase def ( cls [ , lista de parámetros ]) :
cuerpo del método
Los puntos principales son los siguientes:
@classmethod debe estar en la línea sobre el método
  El primer cls debe tener; cls se refiere al " objeto de clase " en sí mismo
Formato de método de clase de llamada: nombre de clase nombre de método de clase (lista de parámetros) . En la lista de parámetros, no es necesario ni posible pasar un valor a cls
Acceder a las propiedades de la instancia y los métodos de la instancia en los métodos de clase causará errores
Cuando la subclase hereda el método de la clase principal, el cls entrante es el objeto de la subclase, no el objeto de la clase principal 
Código específico:
class Student:
    company = "SXT"     #类属性
    
    @classmethod
    def printCompany(cls):
        print(cls.company)
    
Student.printCompany()

 
método estático
       Python permite la definición de métodos que no tienen nada que ver con " objetos de clase " , llamados " métodos estáticos " . El "método estático " no es diferente de definir funciones ordinarias en un módulo, excepto que el " método estático " se coloca en el "espacio de nombre de clase " y debe llamarse a través de " clase " .
Los métodos estáticos están definidos por el decorador @staticmethod en el siguiente formato:
@métodoestático
def   nombre de método estático ([ lista de parámetros ]) :
        cuerpo del método
Los puntos principales son los siguientes:
@staticmethod debe estar en la línea sobre el método
2 Formato de método estático de llamada: nombre de clase nombre de método estático (lista de parámetros)
3 Acceder a propiedades de instancia y métodos de instancia en métodos estáticos causará errores

Código específico:

class Student:
    company = "SXT"  # 类属性
    @staticmethod
    def add(a, b):  # 静态方法
        print("{0}+{1}={2}".format(a,b,(a+b)))
        return a+b
Student.add(20,30)

(5) Destructor ( método __del__ ) y mecanismo de recolección de basura

incinerador de basuras

     __del__() se llama " destructor " y se usa para implementar las operaciones requeridas cuando se destruye un objeto. Por ejemplo: Liberar los recursos ocupados por el objeto, tales como: recursos de archivos abiertos, conexiones de red, etc.
       Python implementa la recolección automática de basura. Cuando no se hace referencia al objeto (el recuento de referencias es 0), el recolector de basura llama a __del__() .
       También podemos eliminar objetos a través de la instrucción del , garantizando así que se llame a __del__() . El sistema proporcionará automáticamente el método __del__ , generalmente no se requiere ningún método de destructor personalizado
Código específico:
class Person:
     def __del__(self):
          print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")
Resultado de la operación:
 

Método __call__ y objeto invocable
En Python , cualquier objeto que pueda aplicarse directamente () a sí mismo y ejecutarlo se denomina objeto invocable.
 
Los objetos a los que se puede llamar incluyen funciones personalizadas, funciones integradas de Python y objetos de instancia mencionados en esta sección.
 
Un objeto que define __call__() se denomina " objeto invocable " , es decir, el objeto puede llamarse como una función.
 
Este método permite que el objeto de instancia se use en forma de " nombre de objeto ()" como si llamara a una función normal .

(6) Tres características principales de la orientación a objetos

Python es un lenguaje orientado a objetos que admite tres características principales de la programación orientada a objetos: herencia, encapsulación (ocultación) y polimorfismo.

 Ⅰ Paquete

     Las propiedades y los detalles de implementación del objeto están ocultos y solo se proporcionan externamente los métodos necesarios. Es equivalente a " encapsular" detalles " y solo exponer " métodos de llamada relevantes " al mundo exterior. La " encapsulación " se realiza a través de los " atributos privados y métodos privados " aprendidos anteriormente .
     Python persigue una sintaxis concisa, y no hay un " carácter de control de acceso" de nivel de sintaxis estricto , y depende más de los programadores para darse cuenta de ello conscientemente.

Ⅱ Herencia

 
       La herencia es una de las tres características de la programación orientada a objetos. La herencia nos facilita la implementación de extensiones de clase. Logre la reutilización del código sin rediseñar las clases. La herencia permite que las subclases tengan las características de la clase principal, lo que mejora la reutilización del código.
      Es una evolución incremental en el diseño.Cuando el diseño original de la clase principal permanece sin cambios, se pueden agregar nuevas funciones o se pueden mejorar los algoritmos existentes.
       Si una nueva clase hereda de una clase diseñada, posee directamente las características de la clase existente, lo que reduce en gran medida la dificultad del trabajo. Las clases existentes se denominan " clases principales o clases base" , y las nuevas clases se denominan " subclases o clases derivadas " .
formato gramatical
    Python admite la herencia múltiple, una subclase puede heredar varias clases principales. La sintaxis para la herencia es la siguiente:
  clase   subclase nombre de clase ( clase principal 1 [ , clase principal 2 , ...]) :
            cuerpo de clase
Aviso:
    Si no se especifica ningún padre en la definición de clase, el padre predeterminado es la clase de objeto . En otras palabras, objeto es la clase principal de todas las clases, que define algunas implementaciones predeterminadas comunes a todas las clases, como: __nuevo__()

Sobre el constructor:
    La subclase no anula __init__ , y cuando se crea una instancia de la subclase, llamará automáticamente a la __init__ definida por la clase principal .
    Cuando la subclase reescribe __init__ , instanciar la subclase no llamará al __init__ definido por la clase principal
    Si reescribe __init__ , puede usar la palabra clave super para usar el constructor de la clase principal, o puede usar el siguiente formato para llamar:
Nombre de la clase principal.__init__(self, lista de parámetros)

Herencia y anulación de los miembros de la clase

Herencia de miembros: las subclases heredan todos los miembros de la clase principal excepto el constructor. ( Las propiedades privadas y los métodos privados también se heredan )
Reescritura de métodos: las subclases pueden redefinir los métodos en la clase principal, lo que anulará los métodos de la clase principal, también conocido como " anulación "
 código:
class Person:
     def __init__(self,name,age):
          self.name = name
          self.age = age

     def say_age(self):
          print(self.name,"的年龄是:",self.age)

     def say_name(self):
          print("我是",self.name)

class Student(Person):
     def __init__(self,name,age,score):
          Person.__init__(self,name,age)
          self.score = score

     def say_score(self):
          print(self.name,"的分数是:",self.score)
     def say_name(self):  #重写父类的方法
          print("报告老师,我是",self.name)

s1 = Student("张三",16,85)
s1.say_score()
s1.say_name()
s1.say_age()
print(Student.mro())
Ver la jerarquía de herencia de una clase
La jerarquía de herencia de esta clase se puede generar     mediante el método mro() de la clase o el atributo __mro__ de la clase.

clase raíz de objeto

      La clase de objeto es la clase principal de todas las clases, por lo que todas las clases tienen las propiedades y métodos de la clase de objeto. Obviamente necesitamos profundizar en la estructura de la clase de objeto. Nos viene muy bien seguir aprendiendo Python en profundidad .

dir() Ver las propiedades del objeto
Para obtener más información sobre los objetos, primero aprenda la función integrada dir() , que nos permite ver fácilmente todas las propiedades del objeto especificado.
[Prueba] Ver todas las propiedades del objeto y comparar con el objeto
Código específico:
class Student(Person):
     def __init__(self,name,age,score):
          Person.__init__(self,name,age)
          self.score = score

     def say_score(self):
          print(self.name,"的分数是:",self.score)
     def say_name(self):  #重写父类的方法
          print("报告老师,我是",self.name)

obj = object()
print(dir(obj))
s1 = Student("张三",15,85)
print(dir(s1))

Efecto específico:

 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', ' __init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']


['__class__', '__delattr__', '__dict__' , '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', ' __init__', '__init_subclass__', '__le__', '__lt__', '__module__' , '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__' , '__subclasshook__', '__weakref__', 'edad' , 'nombre' , ' decir_edad' , 'decir_nombre' , 'decir_puntuación', 'puntuación' ]

De lo anterior podemos encontrar los siguientes puntos:
 
El objeto Stuednt agrega ocho propiedades:
__dict__  , __module__  , __weakref__  , edad, nombre, say_age, say_name, say_score, score
 
Todas las propiedades del objeto , la clase Student  como subclase del objeto obviamente contiene todas las propiedades
 
Al        imprimir age , name y say_age , se encuentra que aunque say_age es un método, en realidad es un atributo. Es solo que el tipo de este atributo es method .

herencia múltiple

       Python admite la herencia múltiple, una subclase puede tener varias " clases principales directas " . De esta manera, tiene las características de " clases múltiples de padres " . Sin embargo, dado que esto será extremadamente complicado por el " nivel general de la clase " , trate de evitar usarlo.

Código específico:
class A:
     def aa(self):
          print("aa")

class B:
     def bb(self):
          print("bb")

class C(B,A):
     def cc(self):
          print("cc")
c = C()
c.cc()
c.bb()
c.aa()

super() obtiene la definición de la clase principal

      En la subclase, si queremos obtener el método de la clase padre, podemos hacerlo a través de super() . super() representa la definición de la clase principal, no el objeto de la clase principal.
  
Quiere llamar al constructor de la clase padre:
super(nombre de subclase, self).__init__(lista de parámetros)
Código específico:
class A:
     def __init__(self):
          print("A的构造方法")

     def say(self):
          print("A: ",self)
          print("say AAA")

class B(A):
     def __init__(self):
           super(B,self).__init__() #调用父类的构造方法
           print("B的构造方法")
     def say(self):
       #A.say(self)  调用父类的say方法
          super().say()   #通过super()调用父类的方法
          print("say BBB")

b = B()
b.say()

resultado de ejecución:

Método de construcción de A
Método de construcción de B
A: <__main__.B objeto en 0x0000014F911A9390>
dice AAA
dice BBB

Ⅲ Polimorfismo

     Polimorfismo significa que la misma llamada de método producirá diferentes comportamientos debido a diferentes objetos. Tales ejemplos abundan en la vida: la misma forma de vida, pero diferentes formas de vivir para diferentes cosas. La vida de un oso corre por el suelo, la vida de un pez nada en el agua y la vida de un águila está en el cielo azul. Tome el jugo como ejemplo, si pone manzanas, producirá jugo de manzana, si pone cocos, producirá jugo de coco, y si pone naranjas, producirá jugo de naranja.

Tenga en cuenta los siguientes dos puntos sobre el polimorfismo :
  El polimorfismo es polimorfismo de métodos, las propiedades no son polimórficas.
  Hay dos condiciones necesarias para la existencia de polimorfismo : herencia y reescritura de métodos.
Código específico:
#多态
class Animal:
     def shout(self):
          print("动物叫了一声")

class Dog(Animal):
     def shout(self):
          print("小狗,汪汪汪")

class Cat(Animal):
     def shout(self):
          print("小猫,喵喵喵")
def animalShout(a):
     a.shout() #传入的对象不同,shout方法对应的实际行为也不同。


animalShout(Dog())
animalShout(Cat())

Supongo que te gusta

Origin blog.csdn.net/qq_63976098/article/details/131614443
Recomendado
Clasificación