Skip to content

Orientado a objetos

Método init()

Se llama automáticamente al crear una instancia de clase.

class Galleta():
    chocolate = False
    def __init__(self):
        print("Se acaba de crear una galleta.")
g = Galleta()
Se acaba de crear una galleta.

Métodos y la palabra self

Self sirve para hacer referencia a los métodos y atributos base de una clase dentro de sus propios métodos.

class Galleta():
    chocolate = False

    def __init__(self):
        print("Se acaba de crear una galleta.")

    def chocolatear(self):
        self.chocolate = True

    def tiene_chocolate(self):
        if (self.chocolate):
            print("Soy una galleta chocolateada :-D")
        else:
            print("Soy una galleta sin chocolate :-(")

g = Galleta() # creo la galleta
g.tiene_chocolate() # miro si hay chocolate
g.chocolatear() # chocolateo la galleta
g.tiene_chocolate() # miro si hay chocolate
Se acaba de crear una galleta.
Soy una galleta sin chocolate :-(
Soy una galleta chocolateada :-D

Parámetros con valores por defecto en el init()

  • Si no se ponen valores por defecto a las variables, en el caso de iniciar una galleta y no añadir parametros mostrara error.
class Galleta():
    chocolate = False

    def __init__(self, sabor=None, forma=None):
        self.sabor = sabor
        self.forma = forma
        if sabor is not None and forma is not None:
            print("Se acaba de crear una galleta {} y {}".format(sabor,forma))

    def chocolatear(self):
        self.chocolate = True

    def tiene_chocolate(self):
        if (self.chocolate):
            print("Soy una galleta chocolateada :-D")
        else:
            print("Soy una galleta sin chocolate :-(")
g = Galleta("salada","cuadrada")
Se acaba de crear una galleta salada y cuadrada

Métodos especiales de clase

Constructor y destructor

class Pelicula:
    # Constructor de clase (al crear la instancia)
    def __init__(self,titulo,duracion,lanzamiento):
        self.titulo = titulo
        self.duracion = duracion
        self.lanzamiento = lanzamiento
        print("Se ha creado la película",self.titulo)

    # Destructor de clase (al borrar la instancia)
    def __del__(self):
        print("Se está borrando la película", self.titulo)

p = Pelicula("El Padrino",175,1972)
  • Al finalizar el script el metodo del se ejecuta por defecto.
Se ha creado la película El Padrino
Se está borrando la película El Padrino

String

Para devolver una cadena por defecto al convertir un objeto a una cadena con str(objeto):

class Pelicula:
    # Constructor de clase
    def __init__(self,titulo,duracion,lanzamiento):
        self.titulo = titulo
        self.duracion = duracion
        self.lanzamiento = lanzamiento
        print("Se ha creado la película",self.titulo)

    # Destructor de clase
    def __del__(self):
        print("Se está borrando la película", self.titulo)

    # Redefinimos el método string
    def __str__(self):
        return "{} lanzada en {} con una duración de {} minutos".format(self.titulo,self.lanzamiento,self.duracion)

p = Pelicula("El Padrino",175,1972)
Se ha creado la película El Padrino
str(p)
'El Padrino lanzada en 1972 con una duración de 175 minutos'

Length

Para devolver un número que simula la longitud del objeto len(objeto):

class Pelicula:
    # Constructor de clase
    def __init__(self,titulo,duracion,lanzamiento):
        self.titulo = titulo
        self.duracion = duracion
        self.lanzamiento = lanzamiento
        print("Se ha creado la película",self.titulo)

    # Destructor de clase
    def __del__(self):
        print("Se está borrando la película", self.titulo)

    # Redefinimos el método string
    def __str__(self):
        return "{} lanzada en {} con una duración de {} minutos".format(self.titulo,self.lanzamiento,self.duracion)

    # Redefinimos el método length
    def __len__(self):
        return self.duracion

p = Pelicula("El Padrino",175,1972)
len(p)
Se ha creado la película El Padrino
Se está borrando la película El Padrino
175

Objetos dentro de objetos

class Pelicula:

    # Constructor de clase
    def __init__(self, titulo, duracion, lanzamiento):
        self.titulo = titulo
        self.duracion = duracion
        self.lanzamiento = lanzamiento
        print('Se ha creado la película:',self.titulo)

    def __str__(self):
        return '{} ({})'.format(self.titulo, self.lanzamiento)

Creando un catálogo de películas

class Catalogo:

    peliculas = []  # Esta lista contendrá objetos de la clase Pelicula

    def __init__(self,peliculas=[]):
        self.peliculas = peliculas

    def agregar(self,p):  # p será un objeto Pelicula
        self.peliculas.append(p)

    def mostrar(self):
        for p in self.peliculas:
            print(p)  # Print toma por defecto str(p)
p = Pelicula("El Padrino",175,1972) # creo pelicula
c = Catalogo([p]) # añado al catalogo
Se ha creado la película: El Padrino

Muestro la peliculas del catalogo

c.mostrar()
El Padrino (1972)
c.agregar(Pelicula("El Padrino: Parte 2",202,1974))  # Añadimos una película directamente
Se ha creado la película: El Padrino: Parte 2

Muestro la peliculas del catalogo

c.mostrar()
El Padrino (1972)
El Padrino: Parte 2 (1974)

Encapsulación

Consiste en denegar el acceso a los atributos y métodos internos de la clase desde el exterior.

En Python no existe, pero se puede simular precediendo atributos y métodos con dos barras bajas __:

class Ejemplo:
    __atributo_privado = "Soy un atributo inalcanzable desde fuera"

    def __metodo_privado(self):
        print("Soy un método inalcanzable desde fuera")
e = Ejemplo()
e.__atributo_privado
e.__metodo_privado()
AttributeError: 'Ejemplo' object has no attribute '__atributo_privado'
AttributeError: 'Ejemplo' object has no attribute '__metodo_privado'

Cómo acceder

Internamente la clase sí puede acceder a sus atributos y métodos encapsulados, el truco consiste en crear sus equivalentes "publicos":

class Ejemplo:
    __atributo_privado = "Soy un atributo inalcanzable desde fuera"

    def __metodo_privado(self):
        print("Soy un método inalcanzable desde fuera")

    def atributo_publico(self):
        return self.__atributo_privado

    def metodo_publico(self):
        return self.__metodo_privado()
e = Ejemplo()
e.atributo_publico()
'Soy un atributo inalcanzable desde fuera'
e.metodo_publico()
Soy un método inalcanzable desde fuera