Metodos

En Python, los métodos son funciones que están definidas dentro de una clase y pueden ser llamadas en las instancias de esa clase. Los métodos son una forma de encapsular comportamientos y acciones que están relacionados con la clase en la que se definen.

Métodos de instancia

Los métodos de instancia son aquellos que se definen dentro de la clase y actúan sobre una instancia de la misma. Esto significa que se pueden acceder a los atributos de instancia y modificarlos.

Un método de instancia se define de la misma manera que una función normal, pero se pasa la palabra clave self como primer argumento. self se refiere a la instancia que llama al método.

Aquí hay un ejemplo de cómo definir un método de instancia en una clase Person:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def say_hello(self):
        print(f"Hello, my name is {self.name} and I'm {self.age} years old.")

En este ejemplo, say_hello() es un método de instancia que imprime un saludo con el nombre y la edad de la persona.

Métodos de clase

Los métodos de clase son aquellos que se definen dentro de la clase, pero en lugar de actuar sobre una instancia, actúan sobre la clase en sí misma. Esto significa que no se puede acceder a los atributos de instancia en un método de clase.

Un método de clase se define utilizando la palabra clave @classmethod antes de su definición. El primer argumento de un método de clase es la clase misma, que se denota como cls por convención.

Aquí hay un ejemplo de cómo definir un método de clase en una clase Person:

class Person:
    all_people = []
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Person.all_people.append(self)
    
    @classmethod
    def count_people(cls):
        print(f"There are {len(cls.all_people)} people.")

En este ejemplo, count_people() es un método de clase que imprime el número de instancias de la clase Person.

Constructor alternativo

Para crear un constructor alternativo usando un classmethod, se debe usar el decorador @classmethod encima del método que se desea usar como constructor. Luego, se puede llamar al método directamente en la clase para crear una nueva instancia de la clase.

Aquí hay un ejemplo de cómo crear un constructor alternativo usando un classmethod en una clase Person:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_string(cls, person_str):
        name, age = person_str.split('-')
        return cls(name, age)

person1 = Person('John', 35)
person2 = Person.from_birth_year("Mike-35")

print(person1.name, person1.age)  # Output: John 35
print(person2.name, person2.age)  # Output: Mike 37

En este ejemplo se ha creado un constructor from_string que toma como argumento el un string que contiene el nombre y edad de una persona separado por un guion (-). Despues llama al constructor principal usando la sintaxis return cls(name, age) para crear una nueva instancia de la clase Person.

Luego, se han creado dos instancias de la clase Person, una utilizando el constructor principal y la otra utilizando el constructor alternativo. Al imprimir los valores de name y age para cada instancia, se puede ver que los valores son correctos y que el constructor alternativo ha funcionado correctamente.

Métodos estáticos

Los métodos estáticos son aquellos que se definen dentro de la clase, pero no actúan sobre la instancia ni sobre la clase. Esto significa que no se puede acceder a los atributos de instancia ni a los atributos de clase en un método estático.

Un método estático se define utilizando la palabra clave @staticmethod antes de su definición. A diferencia de los métodos de instancia y de clase, los métodos estáticos no toman self o cls como primer argumento.

Aquí hay un ejemplo de cómo definir un método estático en una clase Math:

class Math:
    
    @staticmethod
    def add(a, b):
        return a + b

En este ejemplo, add() es un método estático que suma dos números.

Métodos mágicos

Los métodos mágicos son aquellos que tienen nombres especiales y se utilizan para sobrecargar operadores o cambiar el comportamiento predeterminado de las operaciones en una clase.

Por ejemplo, el método __init__() que hemos visto anteriormente es un método mágico que se llama automáticamente cuando se crea una nueva instancia de la clase.

Para sobrecargar el operador de suma (+) en una clase Point, podemos definir el método especial __add__ en la clase. Este método se llama cuando se usa el operador + en dos instancias de la clase Point.

Aquí está un ejemplo:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        new_x = self.x + other.x
        new_y = self.y + other.y
        return Point(new_x, new_y)

p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2

print(p3.x, p3.y)  # Output: 4 6

En este ejemplo, definimos la clase Point con un constructor que toma dos argumentos, x e y, que representan las coordenadas del punto. Luego, definimos el método especial __add__ que toma otro objeto Point como argumento y devuelve un nuevo objeto Point que es la suma de los dos puntos.

En la última línea del ejemplo, creamos dos instancias de la clase Point (p1 y p2) y luego sumamos estas dos instancias usando el operador +. El resultado se almacena en la variable p3, que es otra instancia de la clase Point.

Finalmente, imprimimos las coordenadas de p3 usando los atributos x e y.

Last updated