Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

Programación Orientada a Objetos en Python: Guía Completa y Práctica

Python ha sido un lenguaje orientado a objetos desde su creación. Crear y usar clases y objetos es muy sencillo. Este capítulo te ayuda a convertirte en experto en el soporte de POO de Python.

Si no tienes experiencia previa con POO, consulta un curso introductorio para comprender los conceptos básicos.

Visión General de Terminología POO

Creación de Clases

La sentencia class crea una nueva definición de clase:

class ClassName:
    'Optional class documentation string'
    class_suite

Ejemplo

class Employee:
    'Common base class for all employees'
    empCount = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1

    def displayCount(self):
        print("Total Employee %d" % Employee.empCount)

    def displayEmployee(self):
        print("Name:", self.name, ", Salary:", self.salary)

Creación de Objetos Instancia

Para crear instancias, llama a la clase con los argumentos que acepta __init__:

emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)

Acceso a Atributos

Usa el operador punto con el objeto. Variables de clase se acceden con el nombre de la clase:

emp1.displayEmployee()
emp2.displayEmployee()
print("Total Employee %d" % Employee.empCount)

Ejemplo Completo

#!/usr/bin/python
class Employee:
    'Common base class for all employees'
    empCount = 0
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
    def displayCount(self):
        print("Total Employee %d" % Employee.empCount)
    def displayEmployee(self):
        print("Name:", self.name, ", Salary:", self.salary)

emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print("Total Employee %d" % Employee.empCount)

Resultado:

Name: Zara , Salary: 2000
Name: Manni , Salary: 5000
Total Employee 2

Puedes añadir, eliminar o modificar atributos dinámicamente:

emp1.age = 7  # Añadir
emp1.age = 8  # Modificar
del emp1.age  # Eliminar

Funciones integradas para acceso a atributos:

Atributos de Clase Integrados

Cada clase Python mantiene estos atributos integrados:

Destrucción de Objetos (Recolección de Basura)

Python elimina automáticamente objetos innecesarios para liberar memoria. El recolector de basura se ejecuta durante la ejecución del programa y se activa cuando el contador de referencias de un objeto llega a cero.

El contador aumenta al asignar nuevo nombre o colocar en contenedor (lista, tupla, diccionario). Disminuye al usar del, reasignar referencia o salir de ámbito. Al llegar a cero, Python lo recolecta automáticamente.

Una clase puede implementar __del__() (destructor), invocado cuando la instancia está a punto de ser destruida, útil para limpiar recursos no de memoria.

Ejemplo

#!/usr/bin/python
class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    def __del__(self):
        class_name = self.__class__.__name__
        print(class_name, "destroyed")

pt1 = Point()
pt2 = pt1
pt3 = pt1
print(id(pt1), id(pt2), id(pt3))
del pt1
del pt2
del pt3

Resultado: Point destroyed (una sola vez, cuando la última referencia se elimina).

Herencia de Clases

Puedes crear una clase derivándola de una preexistente listando la clase padre entre paréntesis.

Sintaxis

class SubClassName(ParentClass1[, ParentClass2, ...]):
    'Optional class documentation string'
    class_suite

Ejemplo

#!/usr/bin/python
class Parent:
    parentAttr = 100
    def __init__(self):
        print("Calling parent constructor")
    def parentMethod(self):
        print('Calling parent method')
    def setAttr(self, attr):
        Parent.parentAttr = attr
    def getAttr(self):
        print("Parent attribute:", Parent.parentAttr)

class Child(Parent):
    def __init__(self):
        print("Calling child constructor")
    def childMethod(self):
        print('Calling child method')

c = Child()
c.childMethod()
c.parentMethod()
c.setAttr(200)
c.getAttr()

Resultado:

Calling child constructor
Calling child method
Calling parent method
Parent attribute: 200

También puedes heredar de múltiples clases padre:

class A: ...
class B: ...
class C(A, B): ...

Funciones para verificar relaciones:

Sobrescritura de Métodos

Puedes sobrescribir métodos de la clase padre para funcionalidad especial en la subclase.

Ejemplo

#!/usr/bin/python
class Parent:
    def myMethod(self):
        print('Calling parent method')

class Child(Parent):
    def myMethod(self):
        print('Calling child method')

c = Child()
c.myMethod()

Resultado: Calling child method

Métodos Base de Sobrecarga

MétodoDescripciónLlamada de Ejemplo
__init__(self[, args...])Constructorobj = ClassName(args)
__del__(self)Destructordel obj
__repr__(self)Representación string evaluablerepr(obj)
__str__(self)Representación string imprimiblestr(obj)
__cmp__(self, x)Comparación de objetoscmp(obj, x)

Sobrecarga de Operadores

Define métodos especiales para que los operadores funcionen con tus objetos. Ejemplo con vectores:

#!/usr/bin/python
class Vector:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __str__(self):
        return 'Vector (%d, %d)' % (self.a, self.b)
    def __add__(self, other):
        return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2, 10)
v2 = Vector(5, -2)
print(v1 + v2)

Resultado: Vector(7, 8)

Ocultamiento de Datos

Los atributos con doble guion bajo (__secretCount) no son visibles directamente desde fuera de la clase.

Ejemplo

#!/usr/bin/python
class JustCounter:
    __secretCount = 0
    def count(self):
        self.__secretCount += 1
        print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.__secretCount)  # AttributeError

Python cambia internamente el nombre a _ClassName__attrName. Para acceder: counter._JustCounter__secretCount.

python

  1. Seguimiento Automático de Objetos por Visión Artificial con Raspberry Pi y OpenCV
  2. Clases y objetos en C#: Fundamentos para POO robusta
  3. Dominando tipos de datos en Python: Guía práctica
  4. Dominando operadores en Python: Guía completa
  5. Dominando la sentencia pass en Python: Guía práctica
  6. Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
  7. Dominando Excepciones Personalizadas en Python: Guía Práctica
  8. Dominando la Programación Orientada a Objetos en Python: Clases, Herencia, Encapsulación y Polimorfismo
  9. Dominando la Herencia en Python: Conceptos, Sintaxis y Ejemplos Prácticos
  10. Entendiendo type() e isinstance() en Python: ejemplos prácticos
  11. Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura