Cómo hacer programación orientada a objetos con Python
I. Cómo definir una clase
Antes de usar Python para la programación orientada a objetos, primero comprendamos algunos términos: clase, objeto de clase, objeto de instancia, atributo, función y método.
1. ¿Qué es la orientación a objetos?
La orientación a objetos (OOP) es un método abstracto para comprender el mundo; todo en el mundo se puede abstraer en objetos y todo está compuesto. de objetos. Aplicado a la programación, es un método de desarrollo de programas que utiliza objetos como unidad básica del programa.
2. La diferencia entre orientado a objetos y orientado a procesos
Hemos introducido la orientación a procesos antes. El núcleo de la orientación a procesos radica en la palabra "proceso". los pasos para resolver problemas. El método de proceso para diseñar un programa es como diseñar una línea de ensamblaje, que es una forma de pensar mecánica.
Ventajas: el programa es complejo, engorroso y complicado. p>
Ventajas: los problemas complejos se simplifican y agilizan
Desventajas: poca escalabilidad
Los principales escenarios de aplicación incluyen: kernel de Linux, git, SQL Server: kernel de Linux , servicio git y http
Programación orientada a objetos, el núcleo es el objeto y el objeto es una combinación de características (variables) y habilidades (funciones).
Ventajas: resuelve el problema de la mala escalabilidad del programa
Desventajas: mala capacidad de control, incapaz de predecir el resultado final
El escenario de aplicación principal es el software que cambia con frecuencia. requisitos, es decir, software que interactúa con los usuarios con mayor frecuencia
Cabe señalar que la programación orientada a objetos no puede resolver todos los problemas, solo puede usarse para resolver problemas de escalabilidad. Por supuesto, en el software de Internet actual, la escalabilidad es lo más importante
3. El concepto de objetos y clases
En Python, todo es un objeto y un objeto debe tener su propio atributos, es decir, características, y sus propias funciones, es decir, métodos, métodos.
En Python, las características se representan mediante variables y las funciones se representan mediante funciones. Variables y funciones
Los componentes con las mismas características y funciones extraídas de varios objetos son clases, por lo que una clase es una combinación de una serie de objetos con las mismas características y funciones
Vamos definimos una clase, el método es algo similar a la definición de una función:
#Definir una clase china class Chinese:#***Mismas características country='China'#***Mismas habilidades def hablar(self): print('está hablando chino') def eat(self): print('está comiendo comida china') De esta manera, definimos una clase, que se define usando la palabra clave class p>
2. Los nombres de las clases generalmente están en letras mayúsculas y no requieren paréntesis antes de los dos puntos. Esto es diferente de las definiciones de funciones
3. A diferencia de las funciones, las clases ejecutan el código dentro de la clase durante la fase de definición. p >
4. Las clases tienen dos atributos, ***las mismas características se llaman atributos de datos y ***los mismos atributos de función
¿Cómo definir una clase a partir de esta clase? p>
¿Cómo generar un objeto a partir de esta clase? Creación de instancias:
p1=Chinese()
p2=Chinese() Podemos concluir que no importa cómo sea el mundo real, en el programa, de hecho es el primero Después de allí hay clases, hay objetos
Hemos obtenido dos objetos mediante instanciación, pero hay un problema Los dos objetos que obtuvimos tienen las mismas características y funciones.
De hecho, cuando definimos la clase, nos olvidamos de definir la función __init__(). El método de definición correcto debería ser así:
#Definir una clase china. # ***mismas característicaspaís='China'#initializationdef __init__(self, nombre, edad):
self.name=nombre #Cada objeto tiene su propio nombre self.name=nombre #Cada objeto Todos tienen su propia edad. edad=edad #Cada objeto tiene su propia edad#***Las mismas habilidades def talk(self):print('está hablando chino') def eat(self):print('está comiendo comida china') #Ejemplo Generar un objeto p1=Chinese('zhang', 18) El nombre de la clase entre corchetes es creación de instancias. Después de la creación de instancias, la función __init__ se activará automáticamente, que se puede usar para personalizar cada objeto con sus propias características.
Cuando Defina la función __init__, hay tres parámetros entre paréntesis, pero cuando se realiza la llamada de instanciación, solo se pasan dos valores. ¿Por qué no sale mal? Esto se debe a que la función de self es pasar automáticamente el primer parámetro del objeto en sí a la función __init__ cuando se crea una instancia. Por supuesto, self es solo un nombre. El Sr. Egon dijo que si escribe algunas palabras indiscriminadamente, otras no lo harán. poder entenderlo.
Atención. Este mecanismo de transferencia automática de valores solo se refleja en la creación de instancias de una clase. Además de la creación de instancias, otra función es la referencia de atributo y el método es el nombre de la clase. Atributos
#Atributos de datos de clase de referencia print(Chinese.country) #China#Atributos de función de clase de referencia# Chinese.talk()#TypeError: talk() falta 1 argumento posicional requerido: 'self' print (chino .talk) #lt; función Chinese.talk en 0x000001BC5F13D1E0gt; Chinese.talk('self') #está hablando chino#Agregar propiedad Chinese.color='amarillo'#Eliminar el atributo del Chinese.color del código de error anterior, nosotros Se puede ver que cuando se hace referencia al atributo, no hay transferencia automática de valor.
Hemos aprendido el concepto de espacio de nombres. En el espacio de nombres, definir una variable o definir una función abrirá una sección de memoria, con variables. (atributos de datos) y funciones (atributos de función) en la clase, y también tienen espacios de nombres.
Hay variables (atributos de datos) y funciones (atributos de función) en la clase. También tienen espacios de nombres. Se puede acceder a estos espacios de nombres a través del método .__dict__.
p1=Chinese('zhang', 18. ) print(Chinese.__dict__)#{'__module__': '__main__', 'country': 'China', '__init__': lt; function Chinese.__# init__ at 0x000002187F35D158gt;, 'talk': lt; hablar en 0x000002187F35D1E0gt;, # 'eat': lt; función Chinese.eat en 0x000002187F35D268gt;, '__# dict__': lt; atributo del objeto 'chino' '__dict__'gt;, # '__weakref__': lt; object Atributos de '__weakref__'gt;, '__doc__': Ninguno} print(p1.__dict__)#{'name': 'zhang', 'age': 18} A través de los resultados mostrados en el código anterior, sabemos que el print instanciation Los espacios de nombres de los objetos solo pueden mostrar sus propiedades específicas. Si desea encontrar propiedades que sean exclusivas de otros objetos, debe ingresar al espacio de nombres de la clase para encontrarlas.
Otro problema es que no hay propiedades de función en el espacio de nombres del objeto, por lo que, por supuesto, tiene ir a la clase para encontrarlos, pero diferentes objetos Si la función especificada es una función
p1=Chinese('zhang', 18)
p2=Chinese('li' , 19)print(Chinese.talk)#lt; function.talk)#lt; función Chinese.talk en 0x000001B8A5B7D1E0gt; print(p1.talk) #lt; método enlazado de lt; gt; print(p2.talk)talk) #lt ;método enlazado Chinese.talk de lt;__main__.Objeto chino con dirección 0x000001B8A5B7BDA0gt;gt;Como puede ver, no, sus direcciones de memoria son diferentes. Preste atención al método de enlace, que es un método de enlace.
El objeto en sí solo tiene atributos de datos, pero el mecanismo de clase de Python también vincula funciones de clase al objeto, que se denomina método del objeto o método de enlace. Un método de vinculación vincula de forma única un objeto, y métodos similares vinculados a diferentes objetos pertenecen a diferentes métodos.
Podemos verificarlo:
Al usar esta función: la clase llama al atributo de la función. Como es una función, es el nombre de la función entre paréntesis y los parámetros para pasar los parámetros.
Y cuando un objeto usa esta función, el objeto no tiene atributos de función. Es un método de enlace. La forma de usar el método de enlace también está directamente entre paréntesis, pero la diferencia es que el método de enlace será el objeto mismo de forma predeterminada. el primer parámetro
Clase china:
país='China' def __init__(self, nombre, edad):
self.name=nombre
self.age= edad def hablar(self): print ('s está hablando chino'self.name) def eat(self): print('está comiendo comida china')
p1 =Chino('zhang', 18 )
p2=Chino('li',19)
Chino('li',18)
p2= Chinese('li',19)
Tenga en cuenta que este no es el caso. p>
Chinese.talk(p1) #zhang está hablando Chinop1.talk() #zhang está hablando ¡Siempre que el método esté vinculado, el chino pasará automáticamente el valor! De hecho, nos hemos encontrado con esta situación antes. En Python3, los tipos son clases. Los tipos de datos como lista, tupla, conjunto y dict son en realidad clases. El método que usamos antes, como l1.append(3), también se puede escribir así: l1.append(l1, 3)
Continuar.