summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2019-11-29 23:30:17 +0100
committerEkaitz Zarraga <ekaitz@elenq.tech>2019-11-29 23:30:17 +0100
commit63a969e8687be4f9bede62ee08529043a7a80631 (patch)
tree46858a01859f6b03169e8d9649a73a84cb1907da
parent149bfe7a8a7c5f04595f9c316b6282587afc6017 (diff)
Variables de clase
-rw-r--r--src/05_oop.md46
1 files changed, 46 insertions, 0 deletions
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]: <https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables>
+
+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