Clases Métodos en Python - ProOrientadaObjetos-P-D-AA2023/deber-2-crisespinosa2402 GitHub Wiki

Clases en Python

Para crear una clase vamos a emplear la palabra reservada class seguido de un nombre escrito en minúscula, a excepción de la primera letra de cada palabra, que se escribe en mayúscula, y sin guiones bajos.

class Alumno:

_pass_

Aquí introducimos, además, la palabra reservada pass, que sirve para rellenar un espacio que es requerido sintácticamente. En efecto, no tiene ninguna función. Por lo que, por el momento, tenemos una clase de nombre Alumno que está vacía.

Sabemos que las clases pueden contener funciones, a las que llamamos métodos. Para ello vamos a usar la misma nomenclatura que aprendimos en el apartado anterior, con la diferencia que esta vez todo nuestro código estará indentado cuatro espacios, para indicar que queremos ubicarlo dentro de la clase.

class Alumno:

def saludar(self):
    """Imprime un saludo en pantalla."""
    print("¡Hola, mundo!")

Todas las funciones definidas dentro de una clase deberán tener, al menos, un argumento, que por convención se lo llama self y es una referencia a la instancia de la clase.

alumno = Alumno()

alumno.saludar()

"Al invocar a un método de la clase, no debemos indicar el argumento self, ¡Python hace eso por nosotros!"

alumno = Alumno()

Alumno.saludar(alumno)

Una clase también puede contener variables, a las que se conoce con el nombre de atributos

Para crear atributos definimos un método especial llamado init(), que es invocado por Python automáticamente siempre que se crea una instancia de la clase (conocido también como constructor o inicializador).

class Alumno:

_def __init__(self):_
    _self.nombre = "Pablo"_

_def saludar(self):_
    _"""Imprime un saludo en pantalla."""_
    _print(f"¡Hola, {self.nombre}!")_

Permitir que, al definir una instancia, se pase como argumento el nombre del alumno y éste se almacene en el atributo self.nombre.

class Alumno:

_def __init__(self, nombre):_
    _self.nombre = nombre_

_def saludar(self):_
    _"""Imprime un saludo en pantalla."""_
    _print(f"¡Hola, {self.nombre}!")_

alumno = Alumno("Pablo")

alumno.saludar()

Metodos en Python

Un método es una función que constituye un objeto Python, y este, una clase

Se pueden crear métodos con def dentro de una clase, pudiendo recibir parámetros como entrada y modificar el estado (como los atributos) de la instancia.

  • Lo métodos de instancia “normales” que ya hemos visto como metodo()

  • Métodos de clase usando el decorador @classmethod

  • Y métodos estáticos usando el decorador @staticmethod

Los métodos de instancia:

Reciben como parámetro de entrada self que hace referencia a la instancia que llama al método.

"El uso de "self" es totalmente arbitrario"

Los métodos de instancia:

  • Pueden acceder y modificar los atributos del objeto.

  • Pueden acceder a otros métodos.

  • Dado que desde el objeto self se puede acceder a la clase con self.class, también pueden modificar el estado de la clase

class Clase:

_def metodo(self, arg1, arg2):_

    _return 'Método normal', self_

Y como ya sabemos, una vez creado un objeto pueden ser llamados.

mi_clase = Clase()

mi_clase.metodo("a", "b")

Los métodos de clase:

  • No pueden acceder a los atributos de la instancia.

  • Pero si pueden modificar los atributos de la clase.

Reciben como argumento cls, que hace referencia a la clase. Por lo tanto, pueden acceder a la clase pero no a la instancia.

class Clase:

_@classmethod_
_def metododeclase(cls):_
    _return 'Método de clase', cls_

Se pueden llamar sobre la clase:

Clase.metododeclase()

# ('Método de clase', main.Clase)

Pero también se pueden llamar sobre el objeto:

mi_clase.metododeclase()

# ('Método de clase', main.Clase)

Los métodos estáticos:

  • Se pueden definir con el decorador @staticmethod

  • No aceptan como parámetro ni la instancia ni la clase.

  • No pueden modificar el estado ni de la clase ni de la instancia.

  • Pueden aceptar parámetros de entrada.

  • Pueden resultar útil para indicar que un método no modificará el estado de la instancia ni de la clase.

class Clase:

_@staticmethod_
_def metodoestatico():_
    _return "Método estático"_

mi_clase = Clase()

Clase.metodoestatico()

mi_clase.metodoestatico()

# 'Método estático'

# 'Método estático'

Bibliografía: