Soporte

Habla con gente sobre python en un grupo de skype.
Skype:
hackloper

Python

All created with python

lunes, 21 de septiembre de 2015

Posted by Unknown |
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.
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.
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.
    _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.
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.
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.
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.
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.
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".
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.
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.
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 [b]instanciar una clase[/b] entonces decimos que estamos creando un objeto instanciando la clase "Mi_clase" en resumen es una instancia.
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.
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.
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.
planeta = mi_objeto.__planeta
Si hicieramos esto nos lanzaria un error dicendo que no existe tal atributo.
print(planeta)
print(color)
Por ultimo simplemente imprimimos las variables.

0 comentarios:

Publicar un comentario