>> <<

Lenguaje Python

Clases y objetos

Estructura típica de una clase

A continuación mostramos los elementos típicos de una clase en Python:

Por ejemplo, así definiríamos una clase Persona que almacene los datos de personas, como su nombre, edad o teléfono:

class Persona:

    # Constructor
    def __init__(self, n, e, t):
        self.nombre = n
        self.edad = e
        self.telefono = t

    # Otro método de ejemplo
    def mostrar(self):
        print(self.nombre)

Notar que el constructor tiene una nomenclatura especial: se define un método llamado __init__ con los parámetros correspondientes. Luego veremos cómo se instancian objetos de la clase.

Uso de self

La partícula self en Python es equivalente a la partícula this de otros lenguajes, y se emplea para hacer referencia a los elementos propios de la clase. Es una partícula que debe pasarse como primer parámetro en cada método que necesite acceder a algo de la clase (por ejemplo, a sus atributos), para poderlos referenciar desde dentro del código de ese método. Podemos verlo como ejemplo en el constructor y el método mostrar del ejemplo anterior.

Creación de objetos

Para crear objetos de una clase, empleamos el nombre de la clase y le pasamos entre paréntesis los parámetros del constructor (omitiendo el primero, si es self). Esto llamará internamente al método __init__ que hemos definido. En el ejemplo anterior, podríamos crear personas así:

p1 = Persona("María", 52, "677889900")
print(p1.nombre)                        // María
p1.mostrar()

Modificadores de visibilidad y acceso

En Python todos los elementos de una clase son públicos por defecto, y accesibles desde fuera. Si queremos hacerlos privados, su nombre debe comenzar con el carácter de subrayado _. En este caso, se suelen definir unos métodos públicos especiales, típicamente llamados getters y setters, para acceder a esos elementos privados. Los getters se definen con la anotación @property y los setters con la anotación @setter, especificando el atributo que modifican.

Nuestra clase anterior quedaría así empleando atributos privados con sus getters y setters:

class Persona:

    # Constructor
    def __init__(self, n, e, t):
        self._nombre = n
        self._edad = e
        self._telefono = t

    # Otro método de ejemplo
    def mostrar(self):
        print(self._nombre)

    # Getters
        
        @property
        def nombre(self):
            return self._nombre
        
    @property
    def edad(self):
        return self._edad
        
        @property
        def telefono(self):
            return self._telefono

    # Setters
        
        @nombre.setter
        def nombre(self, n):
            self._nombre = n
        
    @edad.setter
    def edad(self, e):
        if e >= 0:
            self._edad = e
        
        @telefono.setter
        def telefono(self, t):
            self._telefono = t

A la hora de acceder a la información, utilizamos estos elementos públicos:

p1 = Persona("María", 52, "677889900")
p1.edad = 30
print(p1.edad)
(C) NachoIB, 2020 - contacto.lenguaj.es@gmail.com