From 63a969e8687be4f9bede62ee08529043a7a80631 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Fri, 29 Nov 2019 23:30:17 +0100 Subject: Variables de clase --- src/05_oop.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/05_oop.md b/src/05_oop.md index 7d0eacd..dd42cb1 100644 --- a/src/05_oop.md +++ b/src/05_oop.md @@ -309,7 +309,53 @@ forma distinta. A veces como función (*function*) y otras veces como método ### Variables de clase +En el primer ejemplo del capítulo hemos postergado la explicación de `type = +canine` y ahora que ya manejas la mayor parte de la terminología y dominas la +diferencia entre una clase y una instancia de ésta (un *objeto*) es momento de +recogerla. A continuación se recupera la sección del ejemplo para facilitar la +consulta, fíjate en la línea 2. +``` {.python .numberLines} +class Dog: + type = "canine" + def __init__(self, name): + self.name = name + def bark(self): + print("Woof! My name is " + self.name) +``` + +`type` es lo que se conoce como una *variable de clase* (*class variable*). + +> NOTA: En este documento se ha evitado de forma premeditada usar la palabra +> *variable* para referirse a los valores y sus referencias con la intención de +> marcar la diferencia entre ambos conceptos. En este apartado, sin embargo, a +> pesar de que se siga tratando de una referencia, se usa el nombre *class +> variable* porque es como se le llama en la documentación[^class_var] y así +> será más fácil que lo encuentres si en algún momento necesitas buscar +> información al respecto. De esto ya hemos discutido en el capítulo sobre +> datos, donde decimos que *todo es una referencia*. + +[^class_var]: + +Previamente hemos hablado de que los objetos pueden tener propiedades +asociadas, y cada objeto tendrá las suyas. Es decir, que cada instancia de la +clase puede tener sus propias propiedades independientes. El caso que tratamos +en este momento es el contrario, el `type` es un valor que comparten **todas** +las instancias de `Dog`. Cualquier cambio en esos valores los verán todos los +objetos de la clase, así que hay que ser cuidadoso. + +El acceso es idéntico al que ocurriría en un valor asociado al objeto, como en +el caso `name` del ejemplo, pero en este caso observas que en su declaración en +la clase no es necesario indicar `self`, ya no es necesario decir cuál es la +instancia concreta a la que se le asigna el valor: se le asigna a todas. + +A parte de poder acceder a través de los objetos de la clase, es posible +acceder directamente desde la clase a través de su nombre, como a la hora de +acceder a las funciones de clase: `Dog.type` resultaría en `"canine"`. + +> NOTA: Si en algún caso python viera que un objeto tiene propiedades y +> variables de clase definidas con el mismo nombre, cosa que no debería ocurrir +> a menudo, tendrán preferencia las propiedades. ### Encapsulación explícita -- cgit v1.2.3