Programacion orientada a objetos o POO: La Programación Orientada a Objetos es un paradigma de programación, un estilo, una lógica, una organización, una forma de pensar para resolver problemas. Con este paradigma nuestras aplicaciones están basadas en objetos en lugar de comandos y en datos en lugar de lógica.
Ejemplo: Así como los carros están construidos a partir de objetos independientes (como llantas, motor, piezas del motor, entre otras), nuestras aplicaciones van a estar construidas a partir de objetos que pueden tener múltiples instancias pero todas ““heredan”” del mismo objeto (así como las llantas de los carros, cada carro tiene 4 llantas y cada llanta fue construida de la misma manera que las otras).
–> Pensar en nuestra aplicación como objetos independientes que componen la información y sus comportamientos nos aporta muchos beneficios. Entonces pudiesemos:
* Podemos agregar o quitar objetos de nuestra aplicación sin necesidad de cambiar todo el código del programa.
–> Además, por trabajar con objetos separados, cada objeto debe funcionar de forma independiente y debe revisar su lista de dependencias; nos aseguramos de no tener ninguna dependencia de sobra o haciendo falta (por ejemplo: las llantas pueden seguir rodando sin un motor y las puertas pueden abrirse aunque las sillas no puedan inclinarse, todos los objetos son independientes).
Que es una clase, Un ejemplo grafico:
–> Tenemos la imagen, que refleja a un mismo objeto, pero ambos tienen caracteristicas distintas las cuales son su tipo de color y tambien puede ser el tipo material en el que fueron construidos.
Conceptos de POO:
Metodo constructor en Python: Un metodo es una clave que casi todas las clases deben tener init, este el metodo donde se construyen los elementos de la clase
Clase: Si nosotros quitamos todas las diferencias y dejamos unicamente las caracteristicas que comparten, con esto podriamos crear un molde, entonces una clase es un molde, lo cual nos permitira crear n cantidad de controles totalmente iguales, lo cual nos permitira crear objetos apartir de ciertos atributos deacuerdo sean sus requerimientos
Atributos: Tienen una utilidad al igual que una variable pero a diferencia que estas van co-relacionadas con el objeto por ende solo existen dentro de ese objeto
Instancia: En programacion a la creacion de un nuevo objeto, se le denomina instancia, es decir cuando tenemos un molde y de ese molde sacamos otro objeto.
Herencia: La herencia nos permitira crear otras clases apartir de anteriores, como por ejemplo tenemos una clase para definir los heroes, ahora necesitamos una clase para definir a los mobs, a los heroes enemigos, etc etc. Utilizando la herencia podemos crear clases apartir de otras heredando sus caracteresticas y similitudes.
Encapsulacion: Es una de las herramientas más poderosas que tienen los programadores, esta nos permite esconder la complejidad del software.
Polimorfismo: Permite modifcar metodos preexistentes en la superclase
Cuales son sus beneficios:
Su beneficio primordial, es que mediante a la programacion orientada a objetos podemos eliminar o reemplazar objetos sin necesidad de re-estructurar todo el programa, perdiendo mucho tiempo en el, puesto que por ejemplo si tenemos un carro y deseamos eliminarle la puerta de atras, podemos hacerlo sin necesidad de que el motor de dañe.
Comprender cada objeto: Otro beneficio importante de la programacion orientada a objetos, es la facilidad de comprender cada uno de sus objetos puesto que los mismos estaran definidos para un uso como tal y sera mucho mas facil de definir que es lo que pasa con uno de ellos al momento de tener un error.
Funciones para los objetos: Tambien tenemos otro beneficio importante el cual se basa en que todos trabajan de forma distinta lo que quiere decir volviendo al ejemplo del carro si por x razon la puerta trasera del carro no abre, eso no implica que el motor encienda, por ende todos son objetos con sus funcionalidades independientes, pero señalando a un mismo fin, que en este caso seria resolver la necesidad del problema
Trabajo en equipo: Tiene un beneficio al poder trabajar en equipo un grupo de programadores esta trabajando sobre un mismo proyecto y uno de ellos rompe el codigo, el programa como tal seguira funcionando lo unico que se rompera sera el objeto, por ende sera mucho mas facil de localizar error.
Diferentes tipos de metodos en Python: Existen 3 tipos de metodos, los metodos estaticos, de clase y de instancia, cada uno de ellos tiene una finalidad diferente y se pueden utilizar en distintas situaciones.
Metodos estaticos: Para poder crear un metodo estatico es necesario anteponer @staticmethod para indicarle a Python que el metodo debe ser necesariamente estatico. Las caracteristicas principales de un metodo estatico es que pueden ser llamados sin tener una instancia de la clase, ademas este tipo de metodos no tienen acceso al exterior, por lo cual no pueden acceder a ningun otro atributo o llamar alguna otra funcion de la clase.
Ejemplo de metodo estatico: Un metodo estatico puede resultar util para indicar que un metodo dentro modificara el estado de la instancia ni de la clase, de esta forma podremos evitar problemas futuros, otro punto de vista los metodos estaticos se podrian ver como funciones normales a diferencia que estas van ligada a una clase enconcreto.
classClase: @staticmethod defmetodoestatico():return"Método estático"#Metodo estatico
Metodo de clase: Para indicarle a python que el metodo debera ser un metodo de clase se debe anteponer @classmethod, este metodo comparte una caracteristica con el metodo estatico, la diferencia recae en la capacidad de acceder aotros metodos y atributos de la clase sin embargo este tipo de metodo no tiene accesos a atribuos de instancia puesto que el mismo se enfoca en la clase y no las instancias.
classClase: @classmethoddefmetododeclase(cls):return'Método de clase', cls
#############
Se pueden llamar sobre la clase.
#############
Clase.metododeclase()
# ('Método de clase', __main__.Clase)###############
Pero también se pueden llamar sobre el objeto.
###############
mi_clase.metododeclase()
# ('Método de clase', __main__.Clase)
Metodos de instancia: Este método solamente puede ser llamado si se tiene una instancia de la clase. Una vez que se creó una instancia de la clase, se podrá accesar a los métodos de instancia. Un método de instancia es capaz de crear, obtener y cambiar los atributos de instancia y a su vez de llamar otros métodos de instancia y clase
classMethodTypes:
name = "Ragnar"definstanceMethod(self):# Creates an instance atribute through keyword self
self.lastname = "Lothbrock"
print(self.name)
print(self.lastname)
@classmethoddefclassMethod(cls):# Access a class atribute through keyword cls
cls.name = "Lagertha"
print(cls.name)
@staticmethoddefstaticMethod():
print("This is a static method")
# Creates an instance of the class
m = MethodTypes()
# Calls instance method
m.instanceMethod()
MethodTypes.classMethod()
MethodTypes.staticMethod()
self: Es un parametro que es una referencia a la instancia actual de la clase y se usa para acceder a variables que pertencen a la clase, la referencia “self” es solo una forma de llamarlo asi como llamamos al iterador de un for ( i ), self es solo una convension la puedes llamar como quieras, pero tiene que ser el primer parametro de la funcion en la clase
cls: Al igual que self, es solamente una convencion declarada por los desarrolladores de python
Conclusion: La diferencia entre las palabras reservadas self y cls reside solamente en el tipo de método creado, en dado caso que el método sea un método de instancia se utiliza la palabra self, por otra parte si el método es un método de clase se utiliza la palabra reservada cls. Finalmente si el método es un método estático no se utiliza ningúna palabra reservada ya que no tendrá acceso ni a variables ni a métodos de instancia o clase La diferencia entre las palabras reservadas self y cls reside solamente en el tipo de método creado, en dado caso que el método sea un método de instancia se utiliza la palabra self, por otra parte si el método es un método de clase se utiliza la palabra reservada cls. Finalmente si el método es un método estático no se utiliza ningúna palabra reservada ya que no tendrá acceso ni a variables ni a métodos de instancia o clase
Getters" y "Setters en Python: Los “Getters” y “Setters” se utilizan en POO para garantizar el principio de la encapsulación de datos.Claramente el getter se emplea para obtener los datos y el setter para cambiar el valor de los datos. Son decoradores y se identifican por tener un @ (como lo veremos en el ejemplo)
Por lo general, estos se usan en Python:
* Si queremos añadir una lógica de validación para obtener y establecer un valor.
* Para evitar el acceso directo a un atributo de clase (un usuario externo no puede acceder directamente a las variables privadas ni modificarlas).
Python @property: Es uno de los decoradores integrados. El propósito principal de cualquier decorador es cambiar los métodos o atributos de su clase de tal manera que el usuario de su clase no necesite hacer ningún cambio en su código. Por ejemplo
classGeeks:def__init__(self):
self._age = 0# using property decorator# a getter function @propertydefage(self):
print("getter method called")
return self._age
# a setter function @age.setterdefage(self, a):if(a < 18):
raise ValueError("Sorry you age is below eligibility criteria")
print("setter method called")
self._age = a
mark = Geeks()
mark.age = 19
print(mark.age)
>>>setter method called
>>>getter method called
>>>19
IMPORTANTE Todo lo que nos rodea lo podemos interpretar como un objeto un objeto que tiene un estado y una accion
Excelente info, justo esto empezando con el curso de programacion orietada a objetos y antes realice los cursos de python, y esta informacion es excelente para complementar eso y ayudar a entenderlo mejor! mugras gracias!