Activa JavaScript para disfrutar de los vídeos de la Mediateca.
POO en Python - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vale, estamos de nuevo aquí en el módulo de Python. Ya el último tema. El más interesante quizás. Porque, claro, es un tema que es transversal a cualquier tipo de lenguaje, solo para Python.
00:00:01
Vamos a ver, pues eso, conceptos de programación orientado a objetos, encasulación, herencia, polimorfismo.
00:00:20
Si habéis tocado patrones de diseño veréis que todos estos conceptos los tenéis que tener clarísimos y son cosas que se utilizan a día de hoy para cualquier software que se desarrolle.
00:00:28
Tanto para consola como para internet o para dispositivos.
00:00:43
O sea, la programación orientada a objetos es la base de todo realmente
00:00:50
Luego tenemos frameworks que facilitan mucho las cosas
00:00:55
Porque ya se sabe que si por ejemplo vas a crear una página web
00:00:59
Pues los formularios más o menos siempre son los mismos
00:01:05
Entonces se crean frameworks que facilitan mucho las tareas
00:01:08
Y si vas a utilizar Python para creación de videojuegos, que es muy común
00:01:11
o para incluso la guía, pues hay frameworks que te dan librerías que te permiten realizar las típicas cosas que se hacen para esto con un par de instrucciones y te dan muchas herramientas.
00:01:15
Pero incluso esas herramientas también están basadas en programación orientada a objetos.
00:01:31
Entonces, supongo que el concepto de programación orientada a objetos ya os será familiar, ¿no?
00:01:37
O lo habréis visto, habréis visto encasulación, herencia, polimorfismo, pero bueno, vamos a intentar explicarlo de manera breve o por lo menos refrescarlo.
00:01:49
ya que vamos a tratarlo en python y como siempre os he subido aquí un código de ejemplo
00:02:01
que son tres clases personaje guerrero y mago vale y luego como que luchan entre ellos no
00:02:10
está está curioso entonces qué es una clase vale que es un objeto que es una instancia
00:02:19
Digamos que la programación orientada a objetos lo que intenta es organizar un poco más el código y que sea más natural a lo que más o menos es nuestro mundo, ¿vale?
00:02:26
Para que entendamos mejor cómo interacciona el código entre sí y cómo utilizarlo.
00:02:40
Entonces, si pensamos en programación estructurada, que es lo que hemos estado haciendo hasta ahora, lo que conseguimos es spaghetti code, que es lo que se suele decir.
00:02:44
Esto quiere decir que las instrucciones se van ejecutando una tras otra en un código que puede ser infinito.
00:02:57
¿Vale? Los típicos programas antiguos que tienen un montón de hojas de código y son ilegibles, ¿no? Con la programación orientada a objetos, al final esto te da como una estructura y te permite entender las cosas mucho mejor.
00:03:06
Porque el problema que nos encontramos en la informática muchas veces es que hay sistemas que se llevan desarrollando 20 años y la gente que empezó a programar esos sistemas o que tiene un conocimiento amplio de esos sistemas, pues algunos han fallecido, otros se han cambiado de empresa, otros están jubilados.
00:03:23
Entonces está el problema de cómo mantenemos la información y el conocimiento dentro de la empresa. A veces es muy difícil y por eso es tan importante los comentarios de texto, o sea, de código, la documentación, que el código sea legible y que sea más o menos entendible.
00:03:48
Porque se dan los casos como en el efecto 2000 que muchas fechas estaban programadas hasta 1999 y no estaban programadas para reiniciarse en el 2000
00:04:14
Entonces tuvieron que llamar gente jubilada para que ayudara, porque no sabían meterle mano al código
00:04:26
Entonces, a la hora de estructurar y de que el código sea más legible y entendible
00:04:33
No es baladí el hecho de que usando programación orientada a objetos esto se facilita mucho
00:04:41
Y sobre todo luego a la hora de utilizar patrones de diseño
00:04:46
Que son buenas prácticas de problemas que han ido surgiendo con la experiencia que hemos ido acumulando
00:04:50
el sector IT y que están ya resueltos en modos de filigranas que se hacen utilizando la programación orientada a objetos,
00:04:59
con el polimorfismo, con clases abstractas, con todo esto. ¿De acuerdo? Con instancias como el Singleton.
00:05:09
Entonces, vamos a ver primero lo que es una clase. Una clase es algo tan sencillo como un contenedor que tiene atributos,
00:05:17
que son las variables y métodos que son las funcionalidades o capacidades que te permite esta clase.
00:05:26
Por ejemplo, si pensamos en algo facilito como el típico coche, pues va a tener ruedas, que va a ser el número de ruedas,
00:05:36
una potencia, un tipo de motor, un color, va a ser de un segmento, pequeño o grande, 4x4.
00:05:49
Vamos a tener una serie de variables que definen a ese objeto porque una vez que tenemos la clase configurada con nuestras variables
00:06:01
y con las funciones que son las funcionalidades, o sea, nuestros métodos que son las funcionalidades
00:06:17
que puede hacer la clase, lo que vamos a hacer es crear objetos de esa clase.
00:06:24
Crear objetos es, pues eso, tenemos una clase coche genérica y lo que vamos a hacer es crear un objeto
00:06:29
que sea Opel Corsa. Y a ese objeto que es Opel Corsa ya le metemos unos valores a esas variables iniciales, porque ya hemos concretado lo que es el objeto.
00:06:38
Ya sabemos el color del coche, el tipo, el número de ruedas, la potencia, el tipo de motor, si es diésel, gasolina, híbrido. Entonces eso lo llamamos
00:06:53
instanciar el objeto vale tenemos una clase en este caso tenemos la clase personaje la
00:07:04
particularidad de python en programación orienta objetos que es que tiene muchas
00:07:11
particularidades quizás en java o en temas más sea más más evidente es que no hace falta declarar
00:07:16
los atributos los teclas directamente en el constructor el constructor que se declara así
00:07:23
como el guión bajo guión bajo son dos guiones bajos vale guión bajo guión bajo init guión bajo guión
00:07:29
bajo vale y los atributos es decir las variables que contienen la clase y que la definen vale en
00:07:36
este caso tenemos un personaje de rol entonces tenemos nombre nombre fuerza inteligencia defensa
00:07:44
y vida vale entonces si queremos instancia el personaje 0 vale vamos a crear un personaje a
00:07:49
través de la clase personaje y no sé si os habéis dado cuenta pero las clases siempre empiezan con
00:08:05
en mayúscula vale es una normativa estándar que se utiliza en todas partes y que la tenéis que
00:08:11
tener en cuenta vosotros también vale como veis mago la primera mayúscula guerrero la primera
00:08:19
mayúscula personaje la primera mayúscula entonces si queremos crear un personaje basado en estas
00:08:25
características vale lo que lo vamos a estanciar y lo vamos a estanciar utilizando el constructor
00:08:33
Que hemos dicho que es esto de aquí, con init. El constructor es un método que es estándar, que se utiliza con palabras claves. En Java o en C++ os vais a encontrar que lo que tenéis que hacer es definir una función que tenga el mismo nombre que la clase y ya le metéis los atributos.
00:08:44
Pero los atributos tienen que estar definidos antes, porque en C++ y en Java tenéis que definir los tipos de las variables.
00:09:06
Aquí no. Entonces, como aquí no necesitáis definir los tipos de las variables, lo podemos hacer definiéndolas directamente aquí.
00:09:13
Que las podríamos definir también aquí, ¿vale?
00:09:21
Podríamos poner nombre y ponerle un nombre por defecto, ¿no, Pedro?
00:09:25
Y así con todo, ¿vale?
00:09:31
Y luego en el constructor, pues luego lo podremos cambiar. Pero lo normal es hacerlo así porque así es más legible y se ahorra código.
00:09:33
Y si vosotros programáis en Python, pues ya sabéis que la declaración de los atributos se genera aquí.
00:09:45
Entonces, hemos dicho que de una clase se crea un objeto, que es la concreción de esa clase.
00:09:53
Lo habíamos dicho antes, si estamos creando un coche, la clase es coche, pero el objeto es Opel Corsa, que ya le damos valor a los atributos de la clase.
00:10:02
Y el objeto se crea con el constructor, que es este de aquí.
00:10:16
Todo este lenguaje es importante porque luego se va a hablar de estas cosillas.
00:10:23
Y lo que hacemos es instanciarlo. Cuando creamos un objeto lo instanciamos. Hacemos una instancia de la clase. Personaje 1 es instancia de la clase guerrero. Personaje 2 es una instancia de la clase mago.
00:10:27
entonces, aquí, para crear
00:10:41
la personaje 0
00:10:44
con un personaje
00:10:46
utilizando la clase
00:10:47
personaje, vale
00:10:50
pues ya tenemos aquí que le tenemos que dar un
00:10:54
nombre
00:10:57
pues eso, pero
00:10:57
luego le ponemos la defensa
00:11:01
le ponemos la fuerza
00:11:07
le ponemos la inteligencia
00:11:10
y
00:11:12
¿qué más? el nombre
00:11:14
La fuerza va primero
00:11:16
Entonces
00:11:20
Vale, la fuerza va primero
00:11:23
Luego
00:11:26
Uy, que me voy
00:11:28
Luego era la defensa
00:11:31
¿Verdad?
00:11:46
A ver, es el nombre, la fuerza
00:11:48
Bueno, la inteligencia 10
00:11:50
La defensa y la vida
00:11:52
Vale, nombre, fuerza
00:11:53
Inteligencia
00:11:58
Defensa
00:11:59
Le ponemos 5 y la vida 100. Por ejemplo, y así ya tendríamos un objeto de la clase personaje que lo estamos instanciando con el constructor.
00:12:01
¿De acuerdo? Con estos valores. Estos valores son los que les hemos puesto aquí.
00:12:19
Entonces, vale, esto ya está
00:12:24
Tenemos el constructor con el barra baja, barra baja, init, barra baja, barra baja
00:12:32
Le ponemos los atributos de la clase que caracterizan a la clase y con los cuales vamos a crear los objetos de la clase
00:12:39
Y luego tenemos el self, porque self es yo mismo, es la clase
00:12:48
los atributos de la clase de cuando estás utilizando tú el objeto vale entonces si
00:12:56
decimos self que es él yo mismo no el objeto del que estamos hablando vale para inicializarlo si
00:13:03
tenemos un coche pensar que estamos haciendo como una una copia de ese coche un nuevo modelo de
00:13:13
percorsa vale y el nuevo modelo tiene las características estas que estamos hablando
00:13:20
del número de ruedas potencia tipo de motor y todo esto vale eso es el self punto potencia
00:13:26
es el punto número de ruedas es el punto tipo de motor es el punto segmento vale eso es el
00:13:33
Estamos definiendo al Opel Corsa. Entonces, para diferenciar las variables propias del Opel Corsa y las que le estamos pasando, utilizamos el self.
00:13:43
Entonces, con self estamos inicializando los atributos del objeto y los estamos inicializando con los datos que le hemos pasado aquí.
00:13:56
En este caso estamos creando un personaje que se llama Pedro, entonces le pasamos Pedro y vamos inicializando los atributos del objeto de esta clase.
00:14:07
Luego tenemos los métodos, que son las funciones que ese objeto puede hacer.
00:14:25
Vale, digamos que si tenemos un coche, la clase coche, ya tenemos un objeto instanciado que es un opercorsa, pues ¿qué puede hacer este opercorsa?
00:14:41
Puede hacer lo que está implementado en los métodos de la clase. En el caso de la clase coche, pues podría arrancar, acelerar, frenar, repostar, encender la radio, el aire acondicionado...
00:14:53
Pues todas estas acciones son métodos de la clase y cuando creamos un objeto, ese objeto va a tener esas facultades, las facultades que le implementemos en las funciones de la clase.
00:15:07
Entonces, ¿cómo accedemos a estos métodos? Pues ya que tenemos aquí el personaje, accedemos con puntos.
00:15:20
ponemos el punto vale tenemos el objeto que sería el opercorsa por ejemplo en este caso tenemos el
00:15:35
personaje que es pedro y como veis aquí ya tenemos una serie de funcionalidades verdad
00:15:44
tenemos atacar tenemos daño tenemos está vivo tenemos que fuerza se esfuerza subir nivel vale
00:15:51
¿Vale? Entonces, todas esas funcionalidades son las que están implementadas aquí. ¿Vale? Subir nivel, está vivo, atacar, daño. ¿Vale? Así es como accedemos a los métodos de la clase.
00:15:59
Entonces esto es lo que es la programación orientada a objetos. ¿Qué más? Vamos con la herencia. ¿Qué es lo que pasa?
00:16:15
Imaginad que en vez de tener coche tenemos una clase vehículo. Vehículo puede tener... pueden ser de varios tipos.
00:16:29
vale puede ser una moto puede ser un coche puede ser un barco puede ser un avión vale entonces
00:16:39
qué es lo que podemos hacer lo que podemos hacer es crear una clase vehículo vale
00:16:49
y luego tener clases para cada tipo de vehículo porque cada tipo de vehículo tiene sus
00:16:57
características propias pero no dejan de ser vehículos vale porque un coche y un avión son
00:17:03
diferentes pero al final ambos tienen una autonomía ambos tienen un número permitido
00:17:13
de pasajeros ambos tienen quizás un volante vale ambos se mueven con algún tipo de energía ya sea
00:17:20
combustible o queroseno vale entonces todas estas características vale son atributos que
00:17:27
pueden compartir por eso tenemos una clase vehículo y una y unos unos tipos de vehículos
00:17:36
que heredan de esta clase vehículo vale podemos decir que coche avión barco heredan de la clase
00:17:43
vehículo entonces qué es lo que pasa que la clase vehículo vamos a tener lo básico tanto
00:17:48
por el lado de los atributos como por el lado de los métodos vale porque un barco un avión y un
00:17:57
coche arrancan y un barco un avión y un coche tienen que llenar el depósito de combustible
00:18:03
verdad o sea siguen teniendo acciones en común vale entonces decimos que el coche hereda de
00:18:14
vehículo y decimos que que barco y avión heredan de vehículo vale entonces qué es lo que pasa que
00:18:21
vehículo tiene los atributos y las y los métodos básicos que comparten todos los tipos de vehículos
00:18:29
pero luego cada vehículo cada coche cada barco cada avión tendrá sus propias particularidades
00:18:36
¿Verdad? Y por eso, si os fijáis, aquí hemos creado un objeto personaje y tiene cinco atributos.
00:18:43
Sin embargo, si nos vamos a guerrero, tiene seis atributos y mago igual.
00:18:55
¿Y esto por qué es? Porque tanto guerrero como mago son personajes, por lo tanto, heredan de personaje
00:19:00
y se benefician de los atributos de personajes, como vemos aquí, pero resulta que mago tiene un libro y guerrero tiene una espada.
00:19:08
O sea, tienen atributos propios y tienen métodos propios. Por ejemplo, el guerrero tiene un método que es propio, que es cambiar el arma.
00:19:22
¿Vale? Y entonces, como tenemos la espada, si elegimos la opción 1, tenemos el acero varirio, que hace que la espada valga 8, o si ponemos el 2, que tenemos el matadragones, que hace que el daño de la espada sea 10.
00:19:34
Entonces, este método solo va a ser accesible si tienes un objeto instanciado con la clase Guerrero.
00:19:58
¿Vale? Es decir, si yo cojo personaje, no voy a tener ese método accesible.
00:20:12
¿Veis? No está.
00:20:22
Sin embargo, si yo cojo el personaje 1, que sí que está instanciado a través de la clase guerrero, sí que la tiene.
00:20:24
¿Veis? Pero es que no solo personaje tiene cambiar de arma, ¿vale? También tiene daño.
00:20:34
Y si le damos, vemos que tiene atacar, tiene está vivo, tiene morir, ¿vale? Que son métodos de personaje. Y estos métodos los tiene accesibles porque está heredando de él, ¿vale?
00:20:51
O sea, tú cuando heredas de una clase superior, vas a compartir sus atributos y sus métodos.
00:21:09
Y esto todo tiene que tener sentido, porque tanto un vehículo, un coche es un vehículo, como un guerrero es un personaje.
00:21:16
¿Vale?
00:21:24
Hay que planteárselo así.
00:21:26
Entonces, ¿qué tenemos?
00:21:30
Aquí tenemos los personajes, que son características que van a ser comunes a todo tipo de personajes independientemente de si son guerreros, magos o micos.
00:21:32
Y entonces luego tenemos guerrero y mago que heredan de personaje.
00:21:44
¿Y cómo le decimos en Python que hereda de otra clase?
00:21:48
Se lo decimos de esta manera.
00:21:51
Class, guerrero y entre paréntesis le metemos personaje, la clase de la cual hereda.
00:21:53
¿De acuerdo?
00:21:59
Por supuesto, tenemos un constructor y con este constructor lo que hacemos es que llamamos al constructor de la clase superior, de la cual hereda, es decir, de personaje, y le metemos los atributos que acepta este constructor.
00:22:00
Y luego con el self, que ya hemos hablado de que eres tú mismo, el objeto que estás creando
00:22:17
Le añadimos la espada, que es el atributo nuevo que hemos creado para este tipo de personaje
00:22:25
Y ya pues tenemos el método atributo que simplemente te saca la información de los atributos
00:22:34
¿Vale? Del estado de los atributos
00:22:46
Y lo que hacemos es
00:22:48
Llamar a la clase padre
00:22:51
Al método atributos de la clase padre
00:22:53
Y luego añadir las nuevas características que tiene este personaje
00:22:56
Lo mismo hacemos con mago
00:23:00
Y lo mismo hacemos con el constructor de mago
00:23:02
¿Vale? En este caso el libro
00:23:04
Y luego lo que hacemos es
00:23:06
Un concepto
00:23:10
Que os explico nuevo
00:23:13
Que se llama sobrecarga
00:23:15
Sobrecarga de métodos. ¿Qué es lo que pasa? Aquí, cambiar arma es un método propio de la clase guerrero, que no está en personaje.
00:23:16
En personaje no está cambiar arma. Entonces, es un método que es exclusivo de guerrero. ¿Qué es lo que pasa con la herencia?
00:23:27
Que puede ser que, si volvemos al ejemplo de vehículos, con el coche, la moto, el barco o el avión, todos ellos arrancan, ¿vale?
00:23:35
Pero imaginad que todos arrancan con una llave menos, yo que sé, el barco que es con una manivela.
00:23:53
¿Vale? Entonces, ¿qué es lo que pasa? Que para todos estos tipos de vehículos el arrancar con una llave va a ser válido y por lo tanto podrán utilizar el método de la clase de la cual heredan.
00:24:07
Pero para el barco no, porque el barco tiene que arrancar a manivela. Entonces lo que hacemos es el método arranque que tendría la clase vehículo lo sobrecargamos.
00:24:19
¿Qué quiere decir esto? Que en la clase que hereda, que sería la clase barco, definimos otra vez el método arrancar y lo hacemos según la funcionalidad que tenemos que darle para que arranque a manivel el barco.
00:24:33
Es decir, lo cambiamos. Cogemos el método del padre y le decimos, en este caso para esta clase no va a ser así, va a ser de la otra forma.
00:24:52
Y así es como estamos haciendo esto. ¿Por qué?
00:25:03
En la clase personaje tenemos un método que es daño.
00:25:07
Que simplemente es la fuerza menos la defensa del enemigo.
00:25:12
La fuerza tuya menos la defensa que expone el enemigo.
00:25:17
Y esto podría ser así para personajes genéricos.
00:25:24
Pero en este caso, nosotros tenemos una espada y el mago tiene... Perdón, nosotros no. El guerrero tiene una espada y el mago tiene un libro. Y estas cosas influyen.
00:25:30
Entonces lo que tenemos que hacer es sobrecargar el método. Cogemos el mismo daño, porque claro, lo tenemos que llamar igual.
00:25:42
Porque darás cuenta de que si, por ejemplo, este lo llamamos daño 2
00:25:51
Guerrero tendrá acceso a daño 1
00:25:55
Bueno, daño a secas, perdón
00:25:58
Que es el daño de la clase personaje de la cual hereda
00:26:01
Y tendrá acceso a daño 2
00:26:04
O daño guerrero, o como lo quieras llamar
00:26:07
Esto puede inducir errores, ¿vale?
00:26:09
Y no hay necesidad
00:26:12
Porque el guerrero al final va a hacer un tipo de daño
00:26:13
Y es un tipo de daño especial
00:26:16
Que va a ser diferente al daño de la clase de la cual hereda
00:26:18
Entonces por eso lo llamamos que sobrecargamos el método
00:26:23
Y lo llamamos igual, para que no haya ambigüedad
00:26:28
Para que sepamos que el guerrero hace daño con el método daño
00:26:32
Y no hace daño con el método daño suyo, ni daño con el método daño de la clase de la cual hereda
00:26:36
y tal entonces hemos decidido que el daño para guerrero y mago lo vamos a sobrecargar vale
00:26:42
entonces hacemos pues nuestra propia fórmula tanto para guerrero que incluimos la espada
00:26:50
simplemente la fuerza por la espada menos la defensa y como para el mago que simplemente
00:26:55
es la inteligencia por el libro menos la defensa y ya está de acuerdo entonces
00:27:02
Bueno, os puedo explicar un poco
00:27:09
Lo que son las clases abstractas
00:27:12
Porque también puede ser interesante
00:27:14
Realmente no entra en el temario
00:27:17
Algunos ya sabréis lo que son
00:27:18
Pero, ya que estamos
00:27:20
Con todo el cinglao
00:27:23
Igual lo escucháis por ahí
00:27:24
Una clase abstracta, ¿qué es?
00:27:25
Una clase abstracta es una clase
00:27:28
De la cual no vamos a estar haciendo objetos
00:27:30
Es decir, no vamos a crear un objeto
00:27:32
De esa clase
00:27:34
¿Vale? Y con la clase vehículo
00:27:36
Pues se ve muy claro
00:27:38
Si tú realmente tienes una clase vehículo, de la cual hereda coche, moto, yo qué sé, barco y avión, tú no vas a tener necesidad de crear un objeto vehículo.
00:27:39
No tiene sentido, porque tú lo que tienes es un coche, o un barco, o un avión. No tienes un vehículo a secas.
00:27:53
Entonces, lo que tenemos con las clases abstractas es que tú creas una clase de la cual no se puede instanciar objetos
00:28:00
¿Qué quiere decir? Que no puedes crear objetos a partir de esa clase, porque no te va a dejar
00:28:09
Porque no tiene sentido crear un vehículo, tú tienes que crear un coche, un barco, un tren o lo que sea
00:28:15
Eso sí, pero un vehículo no lo vas a crear, entonces esas clases se llaman clases abstractas
00:28:24
Que simplemente dan la base para que hereden y ahorrar código, pero luego no vas a poder instanciarlas, sino que vas a tener que instanciar una de las clases de las cuales se heredan.
00:28:29
Ese es el concepto de clase abstracta.
00:28:42
Vamos con la encasulación. ¿Qué es lo que pasa?
00:28:46
que bueno en python es no se puede utilizar la encapsulación porque aunque crees métodos privados
00:28:49
que ahora lo voy a explicar sí que puedes acceder a los atributos y a los métodos vale pero bueno
00:28:57
si vais a java o hace más más o otros lenguajes que no son tan raros como python sí que vais a
00:29:03
ver que las tanto las variables como los métodos tienen un ámbito un scope lo que se llama en
00:29:11
inglés esto quiere decir que desde fuera
00:29:17
cómo se van a poder leer esas variables o esos métodos
00:29:23
vale pues porque como comprenderéis tenemos aquí los atributos y por
00:29:27
ejemplo si queremos que la inteligencia la defensa de la vida sean siempre
00:29:36
positivos no podemos dejar que la gente utilice la clase de personaje y tenga
00:29:43
acceso directo a estas a estos atributos porque podrían coger y darles datos negativos vale eso
00:29:49
tenemos que controlar cómo se dan valores a estas a estos atributos y para ello lo que hacemos es
00:29:57
utilizar los los scopes de variables o los scopes de los métodos vale los scopes que los más los
00:30:04
más comunes y populares es private public y protect it no si una variable o un método es
00:30:14
público entonces si podría yo desde fuera y decir personaje pues esto personaje 1 punto
00:30:20
fuerza igual a menos 20 entonces ya lo hemos liado vale porque igual si ponemos aquí menos
00:30:31
20 la clase está pensada para que estos números sean positivos y para que lo utilicen métodos que
00:30:39
están suponiendo que estos valores son positivos y si no no funcionan vale te va a dar fallos y
00:30:46
movidas entonces para prevenir esto lo que hacemos es poner las variables privadas una variable
00:30:52
privada es una variable que sólo es accesible dentro de la clase vale dentro de los métodos
00:31:02
Si, por ejemplo, para poner la variable privada en Python, poniéndolo barra baja o barra baja, si lo pongo así, en teoría, solo podría acceder dentro de la clase.
00:31:08
De esta forma. Pero no desde fuera. Esto no me dejaría acceder desde fuera.
00:31:33
O sea, yo sé que accedo aquí
00:31:41
Pero cuando ejecute
00:31:50
Me va a dar un problema
00:31:53
Me va a decir que no lo puede
00:31:54
Me va a dar un fallo de código
00:31:57
Vale, si ejecutamos esto
00:31:59
Es que no estoy en mi ordenador
00:32:02
Y ahora no tengo puestas las cosillas
00:32:23
Vale, me da otros fallos
00:32:26
Por eso no sale
00:32:35
Aquí
00:32:37
No, esto no es
00:32:40
Bueno, me da otros fallos
00:32:42
el código porque bueno lo miraré pero vamos el caso es que si el código estuviera bien
00:32:45
me saltaría un error porque no puedo instanciar una variable privada vale o sea de eso se trata
00:32:53
se trata de qué de que las variables cuando son privadas sólo se pueden ejecutar o sea sólo se
00:33:00
pueden utilizar dentro de la clase no fuera porque si las utilizamos fuera
00:33:11
igual las podríamos utilizar de manera que incorrecta vale entonces por eso lo
00:33:15
que hacemos es que declaramos las variables privadas dentro de la clase y
00:33:21
luego utilizamos métodos
00:33:27
que se suelen llamar get y set para hacer acceder a las variables y para
00:33:31
setear las es decir antes he puesto la vida por ejemplo vamos a quitarlo vale vale pues
00:33:38
imaginaros que está así y en python no pudiéramos acceder desde fuera efectivamente porque sí que
00:34:01
hay un truquillo para poder acceder que no hace falta que lo sepáis pero por eso realmente la
00:34:08
encapsulación no tiene mucho sentido en python en otros lenguajes de programación como os he
00:34:14
comentado en java y en c++ sí porque si ponéis una variable privada nos aparece a la hora de
00:34:18
utilizarlo vale ponéis el punto y aquí veis que sí que os aparece con con la vida pero en
00:34:25
en java y en c++ nos aparecería lo que sí os aparecería sería el get y el set que los tengo
00:34:33
aquí programados vale entonces ya si creo un personaje aparecería el get y aparecería el set
00:34:40
vale pero si por ejemplo es lo que os digo en java y hace más más nos aparecería fuerza aquí
00:34:52
si por eso en el país en lo de las cancelaciones un poco ambiguo vale y por eso no tengo nada en
00:34:59
a su lado, pero
00:35:07
lo que quiero es que os quede el concepto
00:35:08
porque en un futuro, por ejemplo
00:35:10
en Java es muy común, hay mucho
00:35:13
trabajo para programar, entonces en Java
00:35:14
sí que lo vais a ver, que hay
00:35:17
variables, atributos y métodos
00:35:18
que son públicos, privados y protected
00:35:20
que son los más parecidos
00:35:22
protected es
00:35:24
que, por ejemplo, permite
00:35:26
que las variables de las cuales
00:35:29
heredas sean
00:35:31
accesibles, o sea
00:35:32
estas variables, pensad que están protected
00:35:33
Podría accederlas a través de Guerrero
00:35:36
Pero si están
00:35:39
Private, privadas
00:35:40
Si fueran privadas, no podría
00:35:43
Por eso se utiliza el protected
00:35:45
Entonces, si son públicas
00:35:46
Se pueden acceder a pelo desde fuera de la clase
00:35:49
Cosa que no es recomendable
00:35:52
Por lo que os he dicho
00:35:55
Que se podrían manipular los datos
00:35:56
Los atributos y los métodos
00:35:58
Si son private
00:36:01
Si son privadas, solo se pueden
00:36:02
acceder dentro de la clase y si son protected también las pueden acceder las que heredan vale
00:36:05
es así de sencillo entonces ahí va qué es lo que pasa a ver aquí también muy bien qué es lo que
00:36:10
pasa que hemos dicho que lo queremos poner private las variables para que desde fuera nos pueden
00:36:23
cambiar el valor vale entonces aún no puedo decir jolín y cómo accedo si no verdad
00:36:31
lo que vamos a tener con el que se va a ser un acceso controlado es decir cuando yo llamo
00:36:39
a personaje 0.2 fuerza o punto que punto set fuerza lo que vamos a hacer es acceder y poder
00:36:47
manipular ese atributo o llamar a ese método o función pero de manera controlada y como lo
00:36:58
controlas no porque hemos dicho que si está público lo puedes cambiar el dato directamente
00:37:07
que no es lo suyo no y si está privado no puedes acceder a la variable entonces lo que hacemos es
00:37:12
acceder a los métodos que programamos nosotros del get y el set para controlar los valores que
00:37:19
van a tomar esas variables o cuándo puedes y cuándo no llamar a cierto método vale entonces
00:37:25
el que está es muy sencillo porque al final es como un rizón lee vale tampoco puedes hacer gran
00:37:34
daño simplemente obtienes el valor de la variable pero qué sé yo si por ejemplo el valor de la
00:37:41
variable sólo pudiera sostener dependiendo de cierto estado pues tendríamos que verificar si
00:37:46
ese estado se cumple para que yo te pueda devolver esa variable o decirte que nada vale eso se tendría
00:37:52
que programar aquí en el get y luego tenemos el set que es para inicializar la variable bueno
00:37:58
cambiar el valor de la variable del atributo verdad porque eso cuando hablamos de clases
00:38:06
no hablamos de variables hablamos de atributos no hablamos de funciones hablamos de métodos
00:38:14
entonces en este caso si queremos cambiar el atributo y que ese cambio sea coherente con la lógica de negocio que estamos siguiendo
00:38:18
tendremos que hacerlo a través de un método que este sí que es público para que se pueda hacer desde fuera de la clase
00:38:26
y que es el setFuerza y en este caso pues fijaros si yo pusiera menos 4 no me inicializaría el atributo fuerza
00:38:31
Lo que haría sería devolverme un mensaje de error, diciéndome que esa variable no puede ser negativa.
00:38:43
Pues esto es lo que se llama encasulación.
00:38:52
Entonces, seguimos con el último concepto que va a ser el de polimorfismo.
00:38:56
¿Qué pasa con el polimorfismo?
00:39:04
Que, por ponerse un ejemplo, yo aquí quizás no sea tan evidente porque como no tenemos tipado en las variables puede ser un poco más difícil de entender.
00:39:06
Pero imaginad que en vez de ser Python estamos utilizando Java y tenemos que inicializar los objetos con su variable.
00:39:26
No vamos a pensar que estamos utilizando Java.
00:39:38
Entonces, por ejemplo, creamos un vehículo que lo vamos a llamar tipo A.
00:39:41
Hemos dicho que vehículo era una clase de la cual heredaba coche, moto, tren, avión o lo que sea.
00:39:53
no entonces si estamos en java o en temas más lo que vamos a hacer es declarar el tipo de la
00:40:02
variable vale porque son variables tipadas no como en python entonces estamos diciendo que
00:40:14
tenemos un vehículo que es el tipo a y realmente hasta aquí no sabemos qué tipo de vehículo es
00:40:19
verdad pero puede ser cualquiera de los que hereden de vehículo y ese es el polimorfismo
00:40:26
que un objeto vehículo puede tener la forma de un coche de un tren de un avión o de un barco
00:40:32
vale entonces pondríamos coche y ya le pondríamos las variables vale en este caso como estamos en
00:40:41
el país son y no son tipadas pues aquí podríamos poner personaje vale bueno esto no tiene mucho
00:40:49
sentido aquí porque ya es un personaje pero aquí ponemos personaje y lo declaramos como
00:40:58
si fuera un guerrero. ¿Vale? Eso es el polimorfismo. Que dentro de la misma clase, como tiene clases
00:41:02
que heredan de ella, se puede comportar de una forma o de otra. ¿Vale? Con formas polimórficas.
00:41:14
¿De acuerdo? Entonces, pues bueno, aquí definimos un combate que decimos que mientras que el
00:41:22
jugador 1 y el jugador 2 estén vivos
00:41:31
pues se van dando de leches
00:41:33
atacando
00:41:35
y una vez que uno de los dos muera
00:41:36
pues vemos cual está vivo
00:41:39
y lo ejecutamos
00:41:41
y... ah mira
00:41:43
ahora sí que va
00:41:45
antes no iba
00:41:46
ya
00:41:49
bueno, claro, antes ejecuto
00:41:54
el turno 0
00:41:57
y luego miraría
00:41:58
por detrás del código
00:42:01
vería algún error, la verdad es que
00:42:03
tampoco que te dé muchas claves pero bueno veis que vamos por por turnos no y
00:42:05
estos buenos todos lo podemos obviar aquí creamos un personaje de tipo guerrero con
00:42:14
el polimorfismo aquí tenemos un personaje de tipo mago y como son personajes que ya
00:42:20
están instanciados con su clase correspondiente pues saben que tienen que usar el daño de
00:42:27
correspondiente
00:42:31
a la clase
00:42:34
que le hemos estanciado
00:42:36
y aparte tiene todas estas en común
00:42:38
porque heredan de él
00:42:40
¿de acuerdo?
00:42:41
así que nada, os dejo ahí
00:42:44
el código como siempre para que juguéis con él
00:42:46
y
00:42:49
ya miraré
00:42:50
la tarea
00:42:52
para que sea interesante y podáis aprender
00:42:54
y os la abriré la semana que viene
00:42:57
y nada, espero que
00:42:59
hayáis entendido un poco lo que es el mundo
00:43:01
de la programación orientada a objetos
00:43:04
que es bastante importante
00:43:05
y me imagino que ya lo habréis visto
00:43:07
en otras asignaturas también
00:43:10
así que os será familiar
00:43:12
lo único, saber aplicarlo aquí en Python
00:43:13
realmente
00:43:16
que veis que es bastante fácil
00:43:16
el constructor con init
00:43:20
luego declarar los métodos
00:43:21
para la herencia
00:43:24
es así, guerrero
00:43:26
entre paréntesis de la clase
00:43:28
padre y luego
00:43:30
cuando
00:43:32
podéis llamar a la clase padre para utilizar
00:43:32
sus métodos y no tener que
00:43:36
estar otra vez de nuevo inicializando
00:43:38
todo esto, como hemos
00:43:40
hecho aquí, como hemos hecho aquí también
00:43:42
y luego pues eso
00:43:44
los conceptos de sobrecarga de
00:43:46
métodos para
00:43:48
pues ir
00:43:49
haciendo las particularidades
00:43:52
que tiene cada clase
00:43:54
¿de acuerdo? así que nada
00:43:55
Pues muchas gracias por ver el vídeo
00:43:58
Cualquier cosilla ya me decís
00:44:01
Y que paséis buen fin de semana
00:44:04
Adiós
00:44:06
- Materias:
- Tecnología
- Etiquetas:
- Innovación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado básico
- Primer Curso
- Segundo Curso
- Ciclo formativo de grado medio
- Primer Curso
- Segundo Curso
- Ciclo formativo de grado superior
- Primer Curso
- Segundo Curso
- Ciclo formativo de grado básico
- Subido por:
- Alberto S.
- Licencia:
- Reconocimiento
- Visualizaciones:
- 11
- Fecha:
- 17 de abril de 2026 - 20:08
- Visibilidad:
- Público
- Centro:
- IES CIFP a Distancia Ignacio Ellacuría
- Duración:
- 00′ 09″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 175.43 MBytes