←back to Blog

Curso Odoo Tema 4

Estos conceptos proporcionan una base sólida para entender la programación orientada a objetos en Python y son fundamentales al trabajar con Odoo, que utiliza este enfoque para modelar sus entidades y lógica de negocio.

3.9.1. Clases y Objetos:

En Python, las clases son la piedra angular de la programación orientada a objetos (POO). Las clases proporcionan una forma de encapsular datos y comportamientos relacionados en un solo lugar. Aquí hay una descripción detallada de cómo trabajar con clases y objetos:

Definición de una Clase:

# Para definir una clase en Python, utilizamos la palabra clave class. Aquí hay un ejemplo simple:

class Persona:

 def __init__(self, nombre, edad):

 self.nombre = nombre

 self.edad = edad

La función __init__ es un método especial llamado constructor, que se ejecuta automáticamente cuando se crea un nuevo objeto de la clase. self hace referencia a la instancia actual de la clase.

Creación de Objetos:

# Una vez que hemos definido una clase, podemos crear objetos de esa clase. Cada objeto es una instancia única de la clase.

# Crear objetos de la clase Persona

persona1 = Persona(nombre=”Juan”, edad=30)

persona2 = Persona(nombre=”María”, edad=25)

  • Atributos y Métodos:
    • Atributos: Son variables que almacenan datos relacionados con la clase. En el ejemplo anterior, nombre y edad son atributos de la clase Persona.
    • Métodos: Son funciones que están asociadas a la clase. Pueden realizar operaciones en los datos de la clase. El método __init__ es un ejemplo de un método.
  • Acceso a Atributos y Métodos:
    Para acceder a los atributos y métodos de un objeto, utilizamos la notación de punto (.).

# Acceder a atributos

print(persona1.nombre) # Salida: Juan

print(persona2.edad) # Salida: 25

# Llamar a métodos

persona1.cumplir_anios() # Suponiendo que haya un método ‘cumplir_anios’ en la clase

    • En este ejemplo, se asume que hay un método cumplir_anios en la clase Persona.
  • Herencia:
    La herencia permite que una clase herede atributos y métodos de otra clase. Esto facilita la reutilización de código y la creación de una jerarquía de clases.

class Estudiante(Persona):

 def __init__(self, nombre, edad, curso):

 super().__init__(nombre, edad) # Llama al constructor de la clase padre

 self.curso = curso

En este caso, la clase Estudiante hereda de la clase Persona.

  • El encapsulamiento es un principio de POO que consiste en ocultar los detalles internos de una clase y exponer solo lo que es necesario. En Python, los atributos y métodos pueden tener niveles de visibilidad como público, protegido o privado.

class MiClase:

 def __init__(self):

 self.atributo_publico = 42

 self._atributo_protegido = “Hola”

 self.__atributo_privado = [1, 2, 3]

En este ejemplo, atributo_publico es público, _atributo_protegido es protegido y __atributo_privado es privado.

El entendimiento de estos conceptos es esencial para trabajar efectivamente con Odoo, ya que Odoo utiliza extensivamente la programación orientada a objetos para modelar y gestionar los datos y la lógica de negocio.

3.9.2. Herencia:

La herencia es un concepto clave en programación orientada a objetos que permite que una clase adquiera los atributos y métodos de otra clase, facilitando la reutilización de código y la creación de una jerarquía de clases. Aquí se detallan los aspectos esenciales de la herencia en Python:

Definición de Clases Padres:

# En el contexto de herencia, la clase de la que se heredan las características se denomina “clase padre” o “superclase”. Aquí hay un ejemplo simple:

class Animal:

 def __init__(self, nombre):

 self.nombre = nombre

 def hacer_sonido(self):

 pass # Este método será implementado por las clases hijas

Creación de Clases Hijas:

# Las clases que heredan de otra clase se denominan “clases hijas” o “subclases”. Pueden heredar atributos y métodos de la clase padre y también pueden tener sus propios atributos y métodos.

class Perro(Animal):

 def hacer_sonido(self):

 return “Guau”

En este ejemplo, la clase Perro hereda de la clase Animal.

Uso de la Función super:

# La función super() se utiliza para llamar a un método de la clase padre desde la clase hija. Esto es útil cuando queremos extender el comportamiento de un método en la clase hija.

class Gato(Animal):

 def hacer_sonido(self):

 sonido_animal = super().hacer_sonido()

 return f”{sonido_animal} y Maullar”

Aquí, super().hacer_sonido() llama al método hacer_sonido de la clase Animal.

Sobreescritura de Métodos:

# Una clase hija puede proporcionar su propia implementación de un método que hereda de la clase padre. Este proceso se conoce como “sobreescritura de métodos”.

class Pajaro(Animal):

 def hacer_sonido(self):

 return “Pío”

En este caso, la clase Pajaro sobreescrive el método hacer_sonido heredado de Animal.

Herencia Múltiple:

# Python permite la herencia múltiple, lo que significa que una clase puede heredar de más de una clase. Sin embargo, debe usarse con precaución, ya que puede llevar a complejidades en el código.

class Mascota(Perro, Gato):

 pass

# En este ejemplo, la clase Mascota hereda de las clases Perro y Gato

3.9.3. Métodos:

En programación orientada a objetos, los métodos son funciones asociadas a un objeto específico. Aquí se detallan los aspectos esenciales de los métodos en Python:

Definición de Métodos:

Los métodos son funciones definidas dentro de una clase y se utilizan para realizar operaciones específicas relacionadas con los objetos de esa clase. Aquí hay un ejemplo simple:

class Vehiculo:

 def acelerar(self):

 print(“Acelerando…”)

    • En este ejemplo, acelerar es un método de la clase Vehiculo.
  • Invocación de Métodos:
    Los métodos se llaman sobre objetos específicos de una clase. Aquí hay cómo se invocaría el método acelerar:

mi_coche = Vehiculo()

mi_coche.acelerar()

    • En este caso, se crea una instancia de la clase Vehiculo llamada mi_coche, y luego se invoca el método acelerar en esa instancia.
  • Métodos con Parámetros:
    Los métodos pueden aceptar parámetros, que son valores que se pasan al método para que los utilice en su lógica interna.

class Calculadora:

 def sumar(self, a, b):

 return a + b

    • En este ejemplo, el método sumar acepta dos parámetros, a y b, y devuelve su suma.
  • Métodos de Clase y Métodos Estáticos:
    • Métodos de Clase: Son métodos que trabajan con la clase y no con instancias particulares. Se definen utilizando el decorador @classmethod.

class MiClase:

 @classmethod

 def metodo_de_clase(cls):

 print(f”Método de clase llamado en {cls}”)

  • Métodos Estáticos: Son métodos que no acceden ni modifican el estado de la clase ni del objeto. Se definen utilizando el decorador @staticmethod.

class Utilidades:

 @staticmethod

 def saludar():

 print(“¡Hola!”)

  • Métodos Mágicos (Dunder Methods):
    Son métodos especiales en Python que tienen doble guion bajo al principio y al final de su nombre (por ejemplo, __init__). Estos métodos son llamados automáticamente en ciertos eventos.

class Persona:

 def __init__(self, nombre):

 self.nombre = nombre

 def __str__(self):

 return f”Persona: {self.nombre}”

    • En este ejemplo, __init__ se llama automáticamente al crear una nueva instancia, y __str__ se llama cuando se intenta convertir el objeto a una cadena.

Los métodos son esenciales en la programación orientada a objetos, ya que encapsulan el comportamiento y las operaciones asociadas a los objetos de una clase. En el desarrollo de módulos en Odoo, se utilizan métodos extensivamente para implementar la lógica de negocio.

3.10. Entrada y Salida de Ficheros:

En programación, la manipulación de archivos es una tarea común. Aquí se exploran las operaciones básicas de entrada y salida de archivos en Python:

  • Abrir un Archivo:
    Para abrir un archivo en Python, se utiliza la función open(). Es importante cerrar el archivo después de usarlo para liberar recursos.

# Abre un archivo para lectura

with open(‘archivo.txt’, ‘r’) as archivo_lectura:

 contenido = archivo_lectura.read()

 print(contenido)

    • En este ejemplo, se abre el archivo archivo.txt en modo de lectura (‘r’) y se lee su contenido.
  • Modos de Apertura de Archivos:
    • ‘r’: Lectura (por defecto).
    • ‘w’: Escritura (crea un archivo nuevo o sobrescribe uno existente).
    • ‘a’: Anexar (añade contenido al final del archivo).
    • ‘b’: Modo binario.
    • ‘x’: Crea un archivo nuevo y falla si ya existe.
  • Lectura y Escritura de Archivos de Texto:

with open(‘archivo.txt’, ‘r’) as archivo_lectura:

 contenido = archivo_lectura.read()

 print(contenido)

with open(‘nuevo_archivo.txt’, ‘w’) as archivo_escritura:

 archivo_escritura.write(‘Hola, mundo!’)

    • En este ejemplo, se lee el contenido de archivo.txt y se escribe una nueva línea en nuevo_archivo.txt.
  • Lectura y Escritura de Archivos Binarios:

with open(‘imagen.jpg’, ‘rb’) as imagen_lectura:

 datos_imagen = imagen_lectura.read()

with open(‘copia_imagen.jpg’, ‘wb’) as imagen_escritura:

 imagen_escritura.write(datos_imagen)

    • Aquí, se leen y escriben datos binarios, útil para archivos como imágenes.
  • Manejo de Archivos con el Context Manager (with):
    El uso del gestor de contexto with garantiza que el archivo se cierre correctamente después de su uso, incluso si ocurre una excepción.

with open(‘archivo.txt’, ‘r’) as archivo:

 contenido = archivo.read()

 # Realizar operaciones con el contenido

  • Operaciones con Líneas:

with open(‘archivo.txt’, ‘r’) as archivo:

 lineas = archivo.readlines() # Obtiene todas las líneas como una lista

 for linea in lineas:

 print(linea.strip()) # Elimina los espacios en blanco alrededor de cada línea

    • Aquí, se leen todas las líneas del archivo y se imprime cada línea sin espacios adicionales.

La manipulación de archivos es crucial en Odoo para tareas como la lectura y escritura de datos desde y hacia archivos CSV, XML o cualquier otro formato utilizado en el intercambio de datos y la integración con otros sistemas.

3.11. Módulos y Paquetes:

En Python, los módulos y paquetes son herramientas fundamentales para organizar y estructurar código. Aquí se exploran estos conceptos:

  • Módulos:
    • Un módulo en Python es simplemente un archivo de Python que contiene funciones, variables y clases.
    • Facilita la organización y reutilización del código.
    • Se importa utilizando la palabra clave import.

# Ejemplo de módulo (archivo mi_modulo.py)

def saludar(nombre):

 return f’Hola, {nombre}!’

# Importar y usar el módulo

import mi_modulo

mensaje = mi_modulo.saludar(‘Usuario’)

print(mensaje)

  • Paquetes:
    • Un paquete es una colección de módulos organizados en un directorio.
    • Incluye un archivo especial llamado __init__.py que indica que el directorio debe tratarse como un paquete.
    • Facilita la gestión de proyectos más grandes.

mi_paquete/

├── __init__.py

├── modulo1.py

├── modulo2.py

└── subpaquete/

 ├── __init__.py

 └── modulo3.py

# Importar y usar módulos desde un paquete

from mi_paquete import modulo1

from mi_paquete.subpaquete import modulo3

mensaje1 = modulo1.saludar(‘Usuario1’)

mensaje3 = modulo3.otro_saludo(‘Usuario2’)

print(mensaje1)

print(mensaje3)

  • Importaciones Específicas:
    • Puedes importar funciones o clases específicas en lugar de importar todo el módulo.

# Importar solo la función saludar desde mi_modulo

from mi_modulo import saludar

mensaje = saludar(‘Usuario’)

print(mensaje)

  • Alias en Importaciones:
    • Puedes asignar alias a módulos o funciones para facilitar su uso.

# Importar con alias

import mi_modulo as mm

mensaje = mm.saludar(‘Usuario’)

print(mensaje)

  • Importación de Todo (*):
    • Importar todas las funciones y variables de un módulo.

# Importar todo desde un módulo (evitar en general, puede causar conflictos de nombres)

from mi_modulo import *

mensaje = saludar(‘Usuario’)

print(mensaje)

Los módulos y paquetes son esenciales en el desarrollo de software modular y organizado. En el contexto de Odoo, el código se organiza en módulos y se implementa como aplicaciones, lo que facilita la gestión y expansión del sistema ERP.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *