Content for Decem's Python course.
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {
6 "slideshow": {
7 "slide_type": "slide"
8 }
9 },
10 "source": [
11 "## 7. Orientación a objetos"
12 ]
13 },
14 {
15 "cell_type": "markdown",
16 "metadata": {
17 "slideshow": {
18 "slide_type": "slide"
19 }
20 },
21 "source": [
22 "Cuando hablamos de **orientación a objetos** estamos hablando de un **paradigma de programación** que se basa en el concepto de *objetos* y *clases de objetos* para **representar una realidad** concreta en un programa."
23 ]
24 },
25 {
26 "attachments": {
27 "image.png": {
28 "image/png": "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"
29 }
30 },
31 "cell_type": "markdown",
32 "metadata": {
33 "slideshow": {
34 "slide_type": "slide"
35 }
36 },
37 "source": [
38 "- Una **clase** representa una categoría, un concepto general, que agrupa objetos que cumplen una serie de condiciones\n",
39 "- Un **objeto** en una concreción, un ejemplo concreto, de uno de los elementos de una clase\n",
40 "\n",
41 ""
42 ]
43 },
44 {
45 "cell_type": "markdown",
46 "metadata": {
47 "slideshow": {
48 "slide_type": "slide"
49 }
50 },
51 "source": [
52 "Las clases son un medio que nos permite juntar datos con funcionalidad. Cuando creas una nueva clase estás creando un nuevo tipo de objeto, permitiendo que puedan crear nuevas instancias de este. Cada clase puede tener:\n",
53 "\n",
54 "- **Atributos**, que **mantienen su estado**, y\n",
55 "- **métodos**, definidos en las clases, que permiten **modificar el estado**."
56 ]
57 },
58 {
59 "cell_type": "markdown",
60 "metadata": {
61 "slideshow": {
62 "slide_type": "slide"
63 }
64 },
65 "source": [
66 "### Nombres y objetos\n",
67 "\n",
68 "Un objeto puede tener diferentes nombres en diferentes lugares del programa. \n",
69 "\n",
70 "Esto es debido a que, como comentábamos al principio, Python internamente, **cuando asignamos un valora una variable, estamos en realidad asociando un nombre a un objeto en concreto**.\n"
71 ]
72 },
73 {
74 "cell_type": "markdown",
75 "metadata": {
76 "slideshow": {
77 "slide_type": "slide"
78 }
79 },
80 "source": [
81 "Esto es similar al funcionamiento de los punteros en otros lenguajes de programación.\n",
82 "\n",
83 "Esto permite que pasar objetos a una función sea barato, ya que sólo se está pasando un \"puntero\" al objeto, de forma que si se modifica dentro de la función, el cambio se ve reflejado fuera.\n",
84 "\n",
85 "Esto se puede aplicar a todos los objetos, **excepto a los tipos básicos inmutables**, como los números, cadenas de texto y tuplas."
86 ]
87 },
88 {
89 "cell_type": "code",
90 "execution_count": 1,
91 "metadata": {
92 "slideshow": {
93 "slide_type": "slide"
94 }
95 },
96 "outputs": [],
97 "source": [
98 "def modify_var(var, value):\n",
99 " var = value\n",
100 "\n",
101 "def modify_list(l, value):\n",
102 " l.append(value)"
103 ]
104 },
105 {
106 "cell_type": "code",
107 "execution_count": 2,
108 "metadata": {
109 "slideshow": {
110 "slide_type": "slide"
111 }
112 },
113 "outputs": [
114 {
115 "name": "stdout",
116 "output_type": "stream",
117 "text": [
118 "3\n",
119 "3\n",
120 "[1, 2, 3]\n",
121 "[1, 2, 3, 4]\n"
122 ]
123 }
124 ],
125 "source": [
126 "var = 3\n",
127 "print(var)\n",
128 "modify_var(var, 4)\n",
129 "print(var)\n",
130 "\n",
131 "some_list = [1, 2, 3]\n",
132 "print(some_list)\n",
133 "modify_list(some_list, 4)\n",
134 "print(some_list)"
135 ]
136 },
137 {
138 "cell_type": "markdown",
139 "metadata": {
140 "slideshow": {
141 "slide_type": "slide"
142 }
143 },
144 "source": [
145 "### Namespaces y scopes\n",
146 "\n",
147 "Antes de entrar en detalle en las clases, conviene entender qué son y cómo funcionan las **espacios de nombres** (namespaces) y las **reglas de alcance** (scopes) en Python."
148 ]
149 },
150 {
151 "cell_type": "markdown",
152 "metadata": {
153 "slideshow": {
154 "slide_type": "slide"
155 }
156 },
157 "source": [
158 "Un **namespace** es un mapa que asocia nombres a objetos, implementado internamente usando diccionarios de Python.\n",
159 "\n",
160 "No existe ninguna relación entre los nombres definidos en diferentes **namespaces**."
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {
166 "slideshow": {
167 "slide_type": "slide"
168 }
169 },
170 "source": [
171 "Un **scope** es una región de un programa de Python desde donde un **namespace** se puede acceder directamente. En todo momento de la ejecución de un programa, hay siempre al menos tres **scopes** anidados:"
172 ]
173 },
174 {
175 "cell_type": "markdown",
176 "metadata": {
177 "slideshow": {
178 "slide_type": "fragment"
179 }
180 },
181 "source": [
182 "1. El scope local, el más interno, que contiene las definiciones de los nombres locales.\n",
183 "2. El scope de cualquier función dentro de la que estemos, empezando por la más interna a la más externa.\n",
184 "3. El scope que contiene los nombres a nivel de módulo.\n",
185 "4. El scope que contiene los nombres reservados del lenguaje."
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {
191 "slideshow": {
192 "slide_type": "slide"
193 }
194 },
195 "source": [
196 "Hay formas de hacer referencia a scopes diferentes, usando `global` y `nonlocal`."
197 ]
198 },
199 {
200 "cell_type": "code",
201 "execution_count": 3,
202 "metadata": {
203 "slideshow": {
204 "slide_type": "slide"
205 }
206 },
207 "outputs": [
208 {
209 "name": "stdout",
210 "output_type": "stream",
211 "text": [
212 "Después de la asignación local: test spam\n",
213 "Después de la asignación nonocal: nonlocal spam\n",
214 "Después de la asignación global: nonlocal spam\n",
215 "En el scope global: global spam\n"
216 ]
217 }
218 ],
219 "source": [
220 "def scope_test():\n",
221 " def do_local():\n",
222 " spam = \"local spam\"\n",
223 "\n",
224 " def do_nonlocal():\n",
225 " nonlocal spam\n",
226 " spam = \"nonlocal spam\"\n",
227 "\n",
228 " def do_global():\n",
229 " global spam\n",
230 " spam = \"global spam\"\n",
231 "\n",
232 " spam = \"test spam\"\n",
233 " do_local()\n",
234 " print(\"Después de la asignación local:\", spam)\n",
235 " do_nonlocal()\n",
236 " print(\"Después de la asignación nonocal:\", spam)\n",
237 " do_global()\n",
238 " print(\"Después de la asignación global:\", spam)\n",
239 "\n",
240 "scope_test()\n",
241 "print(\"En el scope global:\", spam)"
242 ]
243 },
244 {
245 "cell_type": "code",
246 "execution_count": null,
247 "metadata": {},
248 "outputs": [],
249 "source": []
250 }
251 ],
252 "metadata": {
253 "celltoolbar": "Slideshow",
254 "kernelspec": {
255 "display_name": "Python 3",
256 "language": "python",
257 "name": "python3"
258 },
259 "language_info": {
260 "codemirror_mode": {
261 "name": "ipython",
262 "version": 3
263 },
264 "file_extension": ".py",
265 "mimetype": "text/x-python",
266 "name": "python",
267 "nbconvert_exporter": "python",
268 "pygments_lexer": "ipython3",
269 "version": "3.7.1"
270 }
271 },
272 "nbformat": 4,
273 "nbformat_minor": 2
274}