Programación Orientada A Objetos Ejercicios CAJERO en Python
Programación Orientada A Objetos Ejercicios CAJERO en Python
Objetos
Los objetos suelen representar conceptos del dominio del programa, como un estudiante, un
coche, un teléfono, etc. Los datos que describen las características del objeto se
llaman atributos y son la parte estática del objeto, mientras que las operaciones que puede
realizar el objeto se llaman métodos y son la parte dinámica del objeto.
Atributos: Código o Número de la tarjeta, titular, balance, fecha de caducidad, PIN, entidad
emisora, estado (activa o no), etc.
dir(objeto): Devuelve una lista con los nombres de los atributos y métodos del objeto
objeto.Para ver si un objeto tiene un determinado atributo o método se utiliza la siguiente función:
Para acceder a los atributos y métodos de un objeto se pone el nombre del objeto seguido
del operador punto y el nombre del atributo o el método.
objeto.método(parámetros): Ejecuta el método método del objeto objeto con los parámetros que
se le pasen.
En Python los tipos de datos primitivos son también objetos que tienen asociados atributos y
métodos.
Ejemplo. Las cadenas tienen un método upper que convierte la cadena en mayúsculas. Para
aplicar este método a la cadena c se utiliza la instrucción c.upper().
Ejemplo. Las listas tienen un método append que convierte añade un elemento al final de la lista.
Para aplicar este método a la lista l se utiliza la instrucción l.append(<elemento>).
>>> l = [1, 2, 3]
>>> print(l)
[1, 2, 3, 4]
Clases (class)
Los objetos con los mismos atributos y métodos se agrupan clases. Las clases definen los
atributos y los métodos, y por tanto, la semántica o comportamiento que tienen los objetos que
pertenecen a esa clase. Se puede pensar en una clase como en un molde a partir del cuál se
pueden crear objetos.
Para declarar una clase se utiliza la palabra clave class seguida del nombre de la clase y dos
puntos, de acuerdo a la siguiente sintaxis:
Class <nombre-clase>:
<atributos>
<métodos>
Los atributos se definen igual que las variables mientras que los métodos se definen igual que
las funciones. Tanto unos como otros tienen que estar indentados por 4 espacios en el cuerpo
de la clase.
Ejemplo El siguiente código define la clase Saludo sin atributos ni métodos. La palabra
reservada pass indica que la clase está vacía.
>>> print(Saludo)
<class '__main__.Saludo'>
Clases primitivas
>>> type(1)
<class 'int'>
>>> type(1.5)
<class 'float'>
>>> type('Python')
<class 'str'>
>>> type([1,2,3])
<class 'list'>
>>> type((1,2,3))
<class 'tuple'>
<class 'dict'>
Instanciación de clases
Para crear un objeto de una determinada clase se utiliza el nombre de la clase seguida de los
parámetros necesarios para crear el objeto entre paréntesis.
clase(parámetros): Crea un objeto de la clase clase inicializado con los parámetros dados.
Cuando se crea un objeto de una clase se dice que el objeto es una instancia de la clase.
>>> s
>>> type(s)
Definición de métodos
Los métodos de una clase son las funciones que definen el comportamiento de los objetos de
esa clase.
Se definen como las funciones con la palabra reservada def. La única diferencia es que su primer
parámetro es especial y se denomina self. Este parámetro hace siempre referencia al objeto
desde donde se llama el método, de manera que para acceder a los atributos o métodos de una
clase en su propia definición se puede utilizar la sintaxis self.atributo o self.método.
... return
...
>>> s = Saludo()
>>> s.saludar('Alf')
Bienvenido Alf
La razón por la que existe el parámetro self es porque Python traduce la llamada a un método de
un objeto objeto.método(parámetros) en la llamada clase.método(objeto, parámetros), es decir,
se llama al método definido en la clase del objeto, pasando como primer argumento el propio
objeto, que se asocia al parámetro self.
El método __init__
En la definición de una clase suele haber un método llamado __init__ que se conoce
como inicializador. Este método es un método especial que se llama cada vez que se instancia
una clase y sirve para inicializar el objeto que se crea. Este método crea los atributos que deben
tener todos los objetos de la clase y por tanto contiene los parámetros necesarios para su
creación, pero no devuelve nada. Se invoca cada vez que se instancia un objeto de esa clase.
... return
... def mostrar_saldo(self):
... return
>>> t.muestra_saldo()
El saldo es 1000 €
Los atributos que se crean dentro del método __init__ se conocen como atributos del objeto,
mientras que los que se crean fuera de él se conocen como atributos de la clase. Mientras que
los primeros son propios de cada objeto y por tanto pueden tomar valores distintos, los valores
de los atributos de la clase son los mismos para cualquier objeto de la clase.
En general, no deben usarse atributos de clase, excepto para almacenar valores constantes.
...
>>> c1 = Circulo(2)
>>> c2 = Circulo(3)
>>> print(c1.area())
12.56636
>>> print(c2.area())
28.27431
>>> print(c1.pi)
3.14159
>>> print(c2.pi)
3.14159
El método __str__
Otro método especial es el método llamado __str__ que se invoca cada vez que se llama a las
funciones print o str. Devuelve siempre una cadena que se suele utilizar para dar una descripción
informal del objeto. Si no se define en la clase, cada vez que se llama a estas funciones con un
objeto de la clase, se muestra por defecto la posición de memoria del objeto.
... return
>>> print(t)
Herencia
Para crear un clase a partir de otra existente se utiliza la misma sintaxis que para definir una
clase, pero poniendo detrás del nombre de la clase entre paréntesis los nombres de las clases
madre de las que hereda.
Ejemplo. A partir de la clase Tarjeta definida antes podemos crear mediante herencia otra
clase Tarjeta_Descuento para representar las tarjetas de crédito que aplican un descuento sobre
las compras.
Ejemplo en python:
class Tarjeta:
def __init__(self, id, cantidad = 0):
self.id = id
self.saldo = cantidad
return
def mostrar_saldo(self): # Método de la clase Tarjeta que hereda la
clase Tarjeta_descuento
print('El saldo es', self.saldo, '€.')
return
class Tarjeta_descuento(Tarjeta):
def __init__(self, id, descuento, cantidad = 0):
self.id = id
self.descuento = descuento
self.saldo = cantidad
return
def mostrar_descuento(self): # Método exclusivo de la clase
Tarjeta_descuento
print('Descuento de', self.descuento, '% en los pagos.')
return
t = Tarjeta_descuento('0123456789', 2, 1000)
t.mostrar_saldo()
t.mostrar_descuento()
La principal ventaja de la herencia es que evita la repetición de código y por tanto los programas
son más fáciles de mantener.
A partir de una clase derivada mediante herencia se pueden crear nuevas clases hijas aplicando
de nuevo la herencia. Ello da lugar a una jerarquía de clases que puede representarse como un
árbol donde cada clase hija se representa como una rama que sale de la clase madre.
Debido a la herencia, cualquier objeto creado a partir de una clase es una instancia de la clase,
pero también lo es de las clases que son ancestros de esa clase en la jerarquía de clases.
>>> t1 = Tarjeta('1111111111', 0)
True
False
True
True
Sobrecarga y polimorfismo
Los objetos de una clase hija heredan los atributos y métodos de la clase madre y, por tanto, a
priori tienen tienen el mismo comportamiento que los objetos de la clase madre. Pero la clase
hija puede definir nuevos atributos o métodos o reescribir los métodos de la clase madre de
manera que sus objetos presenten un comportamiento distinto. Esto último se conoce
como sobrecarga.
De este modo, aunque un objeto de la clase hija y otro de la clase madre pueden tener un mismo
método, al invocar ese método sobre el objeto de la clase hija, el comportamiento puede ser
distinto a cuando se invoca ese mismo método sobre el objeto de la clase madre. Esto se conoce
como polimorfismo y es otra de las características de la programación orientada a objetos.
Ejemplo 2 python
class Tarjeta:
def __init__(self, id, cantidad = 0):
self.id = id
self.saldo = cantidad
return
def mostrar_saldo(self):
print('El saldo es {:.2f}€.'.format(self.saldo))
return
def pagar(self, cantidad):
self.saldo -= cantidad
return
class Tarjeta_Oro(Tarjeta):
def __init__(self, id, descuento, cantidad = 0):
self.id = id
self.descuento = descuento
self.saldo = cantidad
return
def pagar(self, cantidad):
self.saldo -= cantidad * (1 - self.descuento / 1.00)
t1 = Tarjeta('1111111111', 1000)
t2 = Tarjeta_Oro('2222222222', 1, 1000)
t1.pagar(100)
t1.mostrar_saldo()
t2.pagar(100)
t2.mostrar_saldo()
Principios de la programación orientada a objetos
Polimorfismo: Redefinir los métodos de la clase madre en las clases hijas cuando se requiera
un comportamiento distinto. Así, un mismo método puede realizar operaciones distintas
dependiendo del objeto sobre el que se aplique.
Después se crean objetos con los datos concretos del problema y se hace que los objetos interactúen
entre sí, a través de sus métodos, para resolver el problema. Cada objeto es responsable de una
subtarea y colaboran entre ellos para resolver la tarea principal. Por ejemplo, la terminal de venta
accede a los datos de la tarjeta y da la orden al banco para que haga un cargo en la cuenta vinculada a la
tarjeta.
@property
def age(self):
print("llamando al metodo getter")
return self._age
# a setter function
@age.setter
def age(self, a):
if(a < 18):
raise ValueError("Perdon Usted es menor de edad")
print("llamando al metodo setter")
self._age = a
marco = Edades()
marco.age = 19
print(marco.age)
#jorge = Edades()
#jorge.age = 15
#print(jorge.age)
_______________________________________________________________________
EJERCICIO 1
EJERCICIO 2
Crear una clase llamada Cuenta que tendrá los siguientes atributos: titular (que
es una persona) y cantidad (puede tener decimales). El titular será obligatorio
y la cantidad es opcional. Construye los siguientes métodos para la clase:
EJERCICIO 3
Vamos a definir ahora una “Cuenta Joven”, para ello vamos a crear una nueva
clase CuantaJoven que deriva de la anterior. Cuando se crea esta nueva clase,
además del titular y la cantidad se debe guardar una bonificación que estará
expresada en tanto por ciento.Construye los siguientes métodos para la
clase:
• Un constructor.
• Los setters y getters para el nuevo atributo.
• En esta ocasión los titulares de este tipo de cuenta tienen que ser
mayor de edad., por lo tanto hay que crear un
método esTitularValido() que devuelve verdadero si el titular es mayor
de edad pero menor de 25 años y falso en caso contrario.
• Además la retirada de dinero sólo se podrá hacer si el titular es válido.
• El método mostrar() debe devolver el mensaje de “Cuenta Joven” y la
bonificación de la cuenta.
Piense los métodos heredados de la clase madre que hay que reescribir.
WEBGRAFIA
https://aprendeconalf.es/docencia/python/manual/objetos/