Orientación a objetos bien explicado en python

Iniciado por $francisco, Septiembre 21, 2015, 10:05:45 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 21, 2015, 10:05:45 AM Ultima modificación: Septiembre 21, 2015, 04:37:59 PM por Gabriela
Creo que hay una gran cantidad de gente como por ejemplo yo que nos pudimos liar a la hora de comprender orientación a objetos y quiero hacer estos post para todos aquellos que esta parte les cuesta bastante y para que les sea mas fácil comprenderlo.

Imaginemos que queremos crear una clase donde nos dira el color favorito, su hobby y la musica que mas le gusta, a demas tambien podemos obtener de que planeta "esto fue lo primero que se me ocurrio jeje" pues aqui tenemos la siguiente clase.

Código: python

#by hackloper
#web:  www.hackloper.blogspot.com

class Mi_clase(Object):
    _color = None
    _hobby = None
    _musica = None

    def __init__(self):
        self.__planeta = 'Tierra'

    def set_color(self,color):
        self._color = color

    def set_hobby(self,hobby):
        self._hobby = hobby

    def set_musica(self,musica):
        self._musica = musica

    def get_planeta(self):
         return self.__planeta


comencemos con la primera linea.

Código: python
class Mi_clase(Object):

Creamos la clase y la llamamos "MI_clase" por ejemplo y heredamos de Object que son para clases de nuevo estilo aunque a esto no tenemos que darle importancia hasta que no manejemos bien esto.

Código: python
_color = None
_hobby = None
_musica = None

Creamos los atributos _color, _hobby y _musica, para que lo tengais claro esto simplemente podemos decir que es una propiedad de la clase a la que podemos acceder desde nuestro objecto que mas adelante explicaremos, yo lo puse con un guion bajo "_" al principio de cada atributo pero esto no es necesario simplemente a mi me gusta ponerlo de esta manera para que sea mas legible, también os podeis fijas que no estan puestos dentro "__init__" y que tampoco lleban "self" detras, esto yo lo hago para saber que estos atributos no se definen al llamar a la clase de esta manera tengo el código mas ordena pero también podria estar dentro de "__init__" de ser así tendria que ser de la siguiente manera.
Código: python

self._color = None
self._hobby = None
self._musica = None


De esta manera si debería llevar "self" detras para que no lo identifique como una variable cualquiera si no como atributo de la clase.

Código: python
def __init__(self):
    self.__planeta = 'Tierra'


Comencemos diciendo que cuando se crea una función dentro de una clase a esta función se dice que es un método de esa clase de manera que sería mas correcto decir que está ejecutando el método "__init__" de la clase "Mi_clase", una vez dicho esto vemos que contiene como primer parametro "self" esto debe ir siempre, no es por capricho, esto sirve para que esta función no sea solamente una función cualquiera si no que pase a ser el metodo de esta clase de manera que le pasamos por asi decirlo "a la clase misma" y así poder llamar desde dentro del método a cualquier atributo o incluso a otro metodo de la misma clase, pongamos un ejemplo ahora mismo para que lo entendais.

Código: python
def __init__(self):
    self.__planeta = 'Tierra'
    print(self._color)


Simplemente imprimimos el atributo color pero esto es gracias a el "self" que le pasamos como parametro que hace que podamos utilizarlo para referirnos a cualquier atributo de la clase pero ¿y si quisiera llamar a un método de esta clase? pues hariamos lo siguiente.

Código: python
def __init__(self):
    self.get_planeta()


Es como llamar a una función cualquiera pero con el "self" le estamos diciendo que esta en la misma clase.
La siguiente linea creamos un atributo pero este es algo "especial" es un atributo casi privado y digo que es casi privado porque no es pribado totalmente ya que este es accesible aunque no nos liaremos con esto ahora pero si quiero explicar el porque ponerlo privado, simplemente por que no quiero que por cualquier error se pueda modificar este atributo desde fuera de la clase pero si puede ser modificado desde el interior de la clase.
Código: python

def set_color(self,color):
    self._color = color


Aqui decir que en los métodos de las clases para que nos sea mas claro el código que queramos por costumbre se crean unos métodos que son los que establecen o dan valor a un atributo y otros los que los devuelven a estos métodos se les llama "setter" para los metodos que establecen valores y "getter" a los que los que devuelven el valor, dicho esto vemos que como primer parametro es "self" esto esta claro y como segundo hay que pasarle un parametro que será el color que nos gusta de este modo se guardará en el atributo "self._color".

Lo mismo con los otros dos metodos "set_hobby" y "set_musica".

Código: python
def get_planeta(self):
    return self.__planeta


Una forma mas segura mostrar un atributo sin el riesgo de ser modificado es creando un metodo que devuelva el atributo privado.

Ahora vamos a hacer uso de esta clase.

Código: python
mi_objeto = Mi_clase()

mi_objeto.set_color("verde" )
mi_objeto.set_hobby("futbol" )
mi_objeto.set_musica("pop" )

planeta = mi_objeto.get_planeta()
color = mi_objeto.color

print(planeta)
print(color)


Esto también vamos ir viendolo linea por linea por que me gustaría que quedara todo claro y no se me pase nada y que no se escape cualquier duda.

Código: python
mi_objeto = Mi_clase()


en este caso creamos una variable en este caso al azar y la llamamos "mi_objeto" pero CUIDADO esto ya no va a ser una variable por que estamos llamando a una clase y al llamar a una clase se dice que estamos creando un "objeto" de manera que mi_objeto tenemos que tener claro que va a contener todos los atributos y métodos dentro de este objeto también decir que a esto se le dice instanciar una clase entonces decimos que estamos creando un objeto instanciando la clase "Mi_clase" en resumen es una instancia.

Código: python
mi_objeto.set_color("verde" )


Como ya dijimos ahora tenemos todos los metodos dentro de nuestro objeto y podemos llamarlos y hacemos uso de estos para establecer en este caso el color e igualmente con los otros dos métodos.

Código: python
planeta = mi_objeto.get_planeta()


Ahora creamos una variable y no os confundais, no es un objeto por que no esta instanciando una clase simplemente esta devolviendo el método de el objeto que hemos creado.

Código: python
color = mi_objeto._color


Como veis poemos guardar en una variable tanto lo que devuelva un método como un atributo pero nos daría error si intentasomos devolver el atributo privado.
Código: python

planeta = mi_objeto.__planeta


Si hicieramos esto nos lanzaria un error dicendo que no existe tal atributo.


Código: python
print(planeta)
print(color)


Por ultimo simplemente imprimimos las variables.

Interesante!
Muchas gracias por compartirlo, ¿esto es valido para la versión 2.7 verdad? me parece que de la versión 3 cambia un poco la manera de trabajar la herencia.

Saludos!
Nivel 77 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muchas gracias por esta entrada, me servira mucho ya que estoy aprendiendo python3.

Pues si no me equivoco en python 3 la herencia no cambia, simplemente seria a la hora de manejar texto al imprimir y por ejemplo con una shell con subprocess y cosas asi.