[go: up one dir, main page]

0% encontró este documento útil (0 votos)
241 vistas67 páginas

13 - Programacion Orientada A Objetos en Python 3

Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos y constructores. También cubre temas como atributos de clase vs atributos de objeto, y los métodos especiales __str__() y __repr__() para representar objetos. El documento proporciona ejemplos prácticos para ilustrar estos conceptos fundamentales de la programación orientada a objetos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
241 vistas67 páginas

13 - Programacion Orientada A Objetos en Python 3

Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos y constructores. También cubre temas como atributos de clase vs atributos de objeto, y los métodos especiales __str__() y __repr__() para representar objetos. El documento proporciona ejemplos prácticos para ilustrar estos conceptos fundamentales de la programación orientada a objetos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 67

13 – Programación Orientada a

Objetos en Python 3

Diego Andrés Alvarez Marín


Profesor Asociado
Universidad Nacional de Colombia
Sede Manizales

1
Tabla de contenido
● Historia
● Vocabulario
● La clase mínima
● Atributos de la clase y
del objeto

2
Nota: la mayoría de las diapositivas
mostradas aquí están basadas en el
material de programación orientada
a objetos que se encuentra en:
● https://www.python-course.eu

● Voy en:

https://www.python-course.eu/python3_multiple_inheritance.php

3
La programación orientada a
objetos (POO)
● Apareció con el lenguaje Simula 67 en 1967 y
posteriormente dicho paradigma fue mejorado
con el lenguaje Smalltalk en los 1970s.
● El lenguaje C++ y el lenguaje Java
popularizaron su uso, especialmente, porque la
POO se utiliza frecuentemente para hacer los
entornos gráficos de los programas (GUIs).
● Python es un lenguaje primariamente orientado
a objetos, ya que en este todas las entidades
son objetos. 4
Vocabulario

Un objeto es una realización de una clase. Por ejemplo, en un juego de
estrategia, consideremos la clase “guerrero”. En el contexto de POO cada
guerrero del juego sería un objeto, cada uno de ellos con atributos (edad,
salud, coraza, etc) y métodos (caminar, pelear, comer, etc.)

Los datos que pertenecen a un objeto se les llama los "atributos (o
propiedades) del objeto". En un programa orientado a objetos, estos están
ocultos a través de una interfase, y solo se puede acceder a los atributos del
objeto a través de funciones especiales, a las cuales se les llama métodos en
el contexto de la POO. El poner los datos detrás de la interfase se le llama
encapsulación.

En términos generales, un objeto se define por una clase. Una clase es una
descripción formal del diseño de un objeto, es decir, especifica los atributos y
métodos que el objeto tiene. A estos objetos también se les llama
incorrectamente en español instancias (del inglés "instances") o
realizaciones. Evite confundir una clase con un objeto. Jorge y María son
objetos de la clase “Persona”. Nombre la clase con la primera letra 5en
mayúscula.
En Python todas las entidades son
objetos
Guido van Rossum escribió:
"One of my goals for Python was to make it so
that all objects were "first class." By this, I
meant that I wanted all objects that could be
named in the language (e.g., integers, strings,
functions, classes, modules, methods, and so
on) to have equal status. That is, they can be
assigned to variables, placed in lists, stored in
dictionaries, passed as arguments, and so
forth." (Blog, The History of Python, February
27, 2009)

6
Aquí L1 y L2 son objetos, los
cuales son realizaciones de la
clase “list”. Ellos tienen métodos
asociados (append(), pop()).

7
La clase mínima en Python

● Robot es la clase
● x, y son objetos

● El operador = copia la

referencia.

Las dos instancias de la clase Robot son diferentes.

8
Clases de solo
atributos
(similar a las
estructuras en Atributos de
C/C++) la clase

Atributos
del objeto

9
Un problema muy común cuando trabajamos con clases, es no especificar
con qué realización de la clase queremos hacerlo. Si solo se ha creado una
dirección, es comprensible asumir que el computador sabrá cómo usar la
dirección de la que estás hablando. Sin embargo, esto no siempre es así.
Observa el siguiente ejemplo:

10
11
Métodos
Un método es una función cuyo código está definido
dentro una clase.

Un método difiere de una función en dos aspectos:


● El método pertenece a una clase.
● El primer parámetro en la definición de un método
es una referencia al objeto que llama el método.
Este se reconoce con el nombre self.

12
Agregando métodos
a una clase

Esto es equivalente a decir Perro.imprimir(p) Observe


que aquí self se refiere a p. La notación p.imprimir()
13
es preferible ya que es la estándar en POO.
Tres formas diferentes de llamar a
un método

14
Agregando métodos a una clase
Cuando cree métodos para las clases, tenga en cuenta las siguientes
observaciones:
● Primero se deben listar los atributos, luego los métodos.
● El primer parámetro de un método de una clase debe ser self. Este
parámetro se requiere, incluso si la función no lo usa. self hace
referencia al objeto que llama el método.
● Como tal llamar el primer parámetro self es una convención (self no
es una palabra reservada); podría usarse otro nombre, sin embargo,
es tan extendido su uso, que se recomienda utilizar dicha palabra.

self es como decir el pronombre “mi” (en lenguaje C++ es equivalente
a la palabra reservada this), ya que dentro de una clase estoy
hablando de mi nombre, mi dirección, mi peso, y fuera de la clase
estoy hablando del nombre, dirección y peso de ese objeto.
● Las definiciones de los métodos deben identarse. 15
El método constructor
En POO, un constructor es un método de la clase
cuya misión es inicializar un objeto de una clase.
En el constructor se asignan los valores iniciales
de los atributos del nuevo objeto, y en ciertos
casos prepara el sistema para la creación del
nuevo objeto. Este método se invoca
automáticamente cada vez que una instancia de
una clase es creada.

El constructor en Python es el método


init () 16
Constructores
con parámetros

17
Atributos del objeto vs.
Atributos de la clase
Un atributo del objeto es una variable que toma el valor de acuerdo
al objeto. Por ejemplo en una habitación llena de gente, cada persona
tiene una edad. También se le llama instance attributes (en inglés).
They are owned by the specific instances of a class. This means for
two different instances the instance attributes are usually different.

Los atributos de la clase pertenecen a la clase misma; son atributos


que son compartidos por todos los objetos de la clase, por lo que es
el mismo atributo para cada objeto de la clase. We define class
attributes outside of all the methods, usually they are placed at the
top, right below the class header. Por ejemplo en un grupo de
personas, todas son humanos. Son aquellas variables que se definen
dentro de la clase pero fuera de los métodos. También se le llama
class attributes (en inglés) 18
Los atributos del
objeto pueden
ocultar los atributos
de la clase

19
● En ClassA y es un
atributo del objeto.
● En ClassB x es un
atributo de la clase.

CAMBIAR TEXTO!!!

20
Los atributos del objeto pueden
ocultar los atributos de la clase 21
El atributo dict

Ver :
http://www.python-course.eu/python3_class_and_instance_attributes.php

22
El atributo dict
Continuando con el ejemplo anterior:

● Con el atributo dict de una realización, se pueden


observar los atributos del objeto junto con sus
correspondientes valores.
● Con el atributo dict de una clase, se pueden
observar los atributos de la clase junto con sus
correspondientes valores. 23
La función getattr()

Si el parámetro no existe, retorna


el valor dado por defecto.

24
Agregando atributos a las funciones
Agregar atributos a objetos es
posible en Python; incluso las
funciones pueden tener atributos.
Este tipo de atributos serían
atributos del objeto.

Este hecho se puede utilizar para definir


variables estáticas (en el sentido de
lenguaje C) en Python. Las variables
estáticas son aquellas que conservan su
valor entre llamados a funciones 25
El método str ()

26
Los métodos
str () y repr ()

27
If a class has a str
method, the method will be
used for an instance x of
that class, if either the
function str is applied to it or
if it is used in a print()
function. str will not be
used, if repr is called, or if
Salida por defecto de un we try to output the value
objeto sin método repr directly in an interactive
Python shell.

Otherwise, if a class has


Si el método str () no only the repr method
existe, se utiliza el and no str method,
método
repr () repr will be applied in
the situations, where
str would be applied,28
if
it were available.
Cuando usar repr y cuando usar str
str is always the right
choice, if the output should be
for the end user or in other
words, if it should be nicely
printed.
repr on the other hand is
used for the internal
representation of an object.
The output of repr should
be, if feasible, a string which
can be parsed by the python
interpreter. The result of this
parsing is an equal object.
This means that the following
should be True for an object
"obj":
29
obj == eval(repr(obj))
Referencias y objetos

El operador = copia
la referencia, no el
objeto como tal.

30
Objetos, funciones y referencias

Esta es la tabla de símbolos cuando


se terminó de ejecutar esta línea. A
consignar_dinero_2() se está
transfiriendo una referencia a juan,
31
no una copia de juan.
El método de
copia

32
Atributos públicos, privados y
protegidos
● Los atributos privados (comienzan con dos guiones
bajos ) solo pueden ser llamados dentro de la
definición de la clase. Por fuera de la clase son
inaccesibles e invisibles.
● Los atributos protegidos o restringidos (comienzan
con un guión bajo _) solo se pueden llamar desde
las subclases cuando hay herencia y subclases.
● Los atributos públicos (comienzan con una letra) se
pueden acceder libremente, dentro y fuera de la
definición de la clase.
33
Se puede acceder (leer/escribir)
a un objeto privado mediante:
_nombreclase atributo
Por ejemplo _A privado
SIN EMBARGO NO LO HAGA!

34
Python doesn’t have any mechanisms,
that would effectively restrict you from
accessing a variable or calling a
member method. All of this is a matter
of culture and convention. Por lo tanto,
¡siga las convenciones!

http://radek.io/2011/07/21/private-protected-and-public-in-python/

Observe que todo


este código se ejecutó35
sin error alguno.
El método destructor
In OOP, a destructor is a method which is automatically
invoked when the object is disappears from memory. It can
happen when its lifetime is bound to scope and the
execution leaves the scope, when it is embedded into
another object whose lifetime ends, or when it was
allocated dynamically and is released explicitly. Its main
purpose is to free the resources (memory allocations, open
files or sockets, database connections, resource locks,
etc.) which were acquired by the object along its life cycle
and/or deregister from other entities which may keep
references to it.

El destructor en Python es el método del () 36


El método constructor init () y el
método destructor del ()

Se ejecutó cuando se hizo garbage collection

37
Métodos estáticos
Observe el siguiente problema
cuando accedemos un atributo
privado de la clase.

Si tratamos de utilizar el método


Robot.RobotInstances1(),
observe que aparece un error.

Este aparece ya que no existe


un objeto asociado que se
pueda referir a la variable self.

38
Ahora, si tratamos de utilizar el
método RobotInstances2(), el
cual está definido sin el
parámetro self, entonces
podemos acceder al atributo
privado counter a través de
Robot.RobotInstances2(); sin
embargo, cuando lo tratamos de
acceder a través de un objeto
tenemos un error, porque el
llamado del objeto
inmediatamente pasa el
parámetro self que nadie está
recibiendo.

39
Nosotros queremos un método que
pueda acceder al atributo privado de la
clase ya sea a través del nombre de la
clase o a través del nombre de un objeto.

La solución la proveen los llamados


métodos estáticos, los cuales no
requieren una referencia a un objeto.

Para crear un método estático se


requiere agregar la línea
"@staticmethod" justo antes del
encabezado del método. La línea
"@staticmethod" se le conoce en la
terminología de Python como un
decorador.

Observe entonces el comportamiento del


método estático RobotInstances3(). Es
justo lo que deseábamos. 40
Métodos clase
Los métodos clase (class
methods), al igual que los
métodos estáticos no
dependen de los objetos,
pero a diferencia de los
métodos estáticos, ellos si
dependen de la clase a la
cual pertenecen. De hecho,
el primer parámetro de un
método clase es una
referencia a la clase.

Estos métodos se pueden


llamar a través de un objeto
o utilizando el nombre de la
clase.
41
Métodos estáticos y métodos clase

42
Métodos estáticos vs Métodos clase

43
Encapsulación de datos
http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29

En POO, se denomina encapsulamiento al ocultamiento de los


atributos y/o métodos de un objeto de manera que solo se pueda
cambiar mediante las métodos definidos para esa clase.

El aislamiento protege a los datos asociados de un objeto contra


su modificación por quien no tenga derecho a acceder a ellos,
eliminando efectos secundarios e interacciones. De esta forma el
usuario de la clase puede obviar la implementación de los
métodos y propiedades para concentrarse sólo en cómo usarlos.
Por otro lado se evita que el usuario pueda cambiar su estado de
maneras imprevistas e incontroladas.

Formas de encapsular: Pública, Protegida o restringida, Privada


44
Métodos de acceso y métodos de mutación
(getters and setters)
http://en.wikipedia.org/wiki/Mutator_method

Estos métodos sirven para


Método de implementar el principio de la
acceso encapsulación de datos en
Método de
POO.
mutación
● Los métodos de acceso
(getters o accessors en
inglés), sirven para acceder a
las propiedades (privadas) de
un objeto.
● Los métodos de mutación
Sin embargo hubiera sido deseable escribir (setters o mutators en inglés),
p1.x = p1.x + p2.x sirven para cambiar las
ya que en este caso no se justifica usar los propiedades (privadas) de un
métodos getX() y setX() y hacer encapsulación de
objeto. 45
datos. No se puede hacer porque “x” es privada.
En este caso sí se justifica Sin embargo, Python
crear ambos métodos: ofrece una solución
más elegante:

46
Dos observaciones importantes:
● We just put the code line "self.x = x" in the

init method and the property method


x is used to check the limits of the values.
● We wrote "two" methods with the same

name and a different number of


parameters "def x(self)" and "def x(self,x)".
Esto se supone que no es posible, pero
con el uso del decorador, se permite la
sobrecarga de funciones. 47
Forma alternativa
para definir los
getters y setters
Sin embargo se prefiere utilizar
la forma que usa los decoradores

48
En conclusión, la mejor
forma de acceder a los
atributos de una clase es
usando decoradores, en
caso de ser necesario.

49
Los métodos también se pueden
hacer privados
Método privado

50
Herencia
● Another powerful feature of using classes and
objects is the ability to make use of inheritance. It
is possible to create a class and inherit all of the
attributes and methods of a parent class.
● Our program can create child classes that will
inherit all the attributes and methods of the parent
class. The child classes may then add fields and
methods that correspond to their needs.

51
Herencia
A class can inherit attributes and behaviour
methods from another class, called the
superclass. A class which inherits from a
superclass is called a subclass, also called heir
class or child class. Superclasses are sometimes
called ancestors as well. There exists a hierarchy
relationship between classes. It's similar to
relationships or categorizations that we know from
real life.

52
Herencia

Bikes, cars, buses and trucks are vehicles. pick-ups, vans, sports
cars, convertibles and estate cars are all cars and by being cars
they are vehicles as well. We could implement a vehicle class in
Python, which might have methods like accelerate and brake.
Cars, Buses and Trucks and Bikes can be implemented as
53
subclasses which will inherit these methods from vehicle.
Aquí el atributo nombre
se está heredando.

Observe que los


métodos también se
heredan. En este caso,
el constructor se está
heredando.

Cuando la clase hija


define un método con el
mismo nombre que la
clase padre, el método
de la clase padre se
reemplaza por el método
de la clase hija.
54
En Python 2 sería:
super(Empleado, self). init (nompers)
Python 3 también soporta esa construcción

Si se desea ejecutar
ambos constructores, el de
la clase padre y el de la
clase hija, la clase hija
debe llamar explícitamente
el constructor de la clase
padre.

Adicionalmente, se está
anteponiendo el método
Empleado.imprimir() al
método
Persona.imprimir()

55
Otra forma como se
pueden llamar los
métodos de la clase padre
desde la clase hija:

56
Métodos públicos, privados y
protegidos + herencia

57
Sobrecarga de funciones
In the context of object-oriented programming,
overloading is the ability to define the same
method, with the same name but with a different
number of arguments and types. It's the ability of
one function to perform different tasks, depending
on the number of parameters or the types of the
parameters.

http://www.python-course.eu/python3_inheritance.php

58
Herencia múltiple
● Using multiple inheritance, a class can inherit
attributes and methods from more than one
parent class.

59
60
En resumen, los principios básicos
de la POO son:
● Encapsulación
● Abstracción de datos
● Polimorfismo
● Herencia
● Sobrecarga de operadores

61
Referencias

Wikipedia

http://www.programarcadegames.com/

http://www.python-course.eu/python3_course.php

Documentación de Python:
– https://docs.python.org/3/tutorial/index.html
– https://docs.python.org/3/

Marzal Varó, Andrés; Gracia Luengo, Isabel; García Sevilla,
Pedro (2014). Introducción a la programación con Python 3.
Disponible en: http://dx.doi.org/10.6035/Sapientia93

62
Sobrecarga de funciones
http://en.wikipedia.org/wiki/Function_overloading

Sobrecarga es la capacidad de un lenguaje de


programación, que permite nombrar con el mismo
identificador diferentes variables u operaciones.

En POO la sobrecarga se refiere a la posibilidad de tener


dos o más funciones con el mismo nombre pero
funcionalidad diferente. Es decir, dos o más funciones
con el mismo nombre realizan acciones diferentes. Esto
ocurre porque las funciones reciben un número variado
de argumentos o las funciones reciben diferentes tipos
de datos.
63
Funciones
sobrecargadas
para soportar
diferentes tipos
de datos

64
Funciones
sobrecargadas
para soportar un
número variable
de argumentos

65
The * operator can be
used as a more general
approach for a family of
functions with 1, 2, 3, or
even more parameters

66

También podría gustarte