Métodos de clase, estáticos, y propiedades
Introducción:
Hola gente de Internet, mi nombre es Luis y les doy nuevamente la bienvenida a Mi Diario Python, el mejor blog para Aprender Python.
En el día de hoy veremos algunas funcionalidades que podremos realizar en las clases que creemos en el futuro. Si no tienes conocimientos sobre Programación Orientada a Objetos con Python, en el blog podrás encontrar mucha información de utilidad.
Métodos de clase:
Los métodos de clase son distintos, son llamados por una clase que es pasada al parámetro cls del método. Un uso común de estos son los métodos de fábrica, los cuales instancian un objeto de la clase utilizando diferentes parámetros que aquellos normalmente pasados al constructor de la clase. Los métodos de clase son marcados con un decorador llamado classmethod.
Decoradores en Python
A continuación les mostrare un ejemplo empleando una clase llamada Rectangle, el cual contara con dos métodos, calculate_area y new_square:
class Rectangle: def __init__(self, width, height): self.width = width self.height = height def calculate_area(self): return self. width * self.height @classmethod def new_square(cls, side_length): return cls(side_length, side_length) square = Rectangle.new_square(5) print(square.calculate_area())
25
new_square es un método de clase y se llama en la clase ne vez de en una instancia de clase. Devuelve un nuevo objeto de clase cls.
Técnicamente, los parámetros self y cls son solo convenciones, pueden ser cambiados a cualquier otra cosa. Sin embargo, estas convenciones son respetadas universalmente, así que es mejor seguir ateniéndose a ellas.
Métodos estáticos:
Los métodos estáticos son parecidos a los métodos de clase, excepto que no reciben argumentos adicionales, son idénticos a funciones regulares que pertenecen a una clase. Son marcados con un decorador llamados staticmethod.
class Pizza: def __init__(self, toppings): self.toppings = toppings @staticmethod def validate_toppings(toppings): if toppings == "pineapple": raise ValueError("No pineapples!") else: return True ingredients = ['chesse', 'onions', 'spam'] if all(Pizza.validate_toppings(i) for i in ingredients): pizza = Pizza(ingredients)
Los métodos estáticos se comportan como funciones normales, excepto por el hecho que las puedes llamar desde una instancia de clase.
Propiedades:
Las propiedades ofrecen una manera personalizar el acceso a los atributos de instancia.
Son creadas al poner el decorador property encima de un método, lo cual seignifica que cunado el atributo de instancia con el mismo nombre que el método será llamado en su lugar. Un uso común de una propiedad es hacer que un atributo sea de solo lectura.
A continuación les mostrare un ejemplo del uso de property:
class Pizza: def __init__(self, toppings): self.toppings = toppings @property def pineapple_allowed(self): return False pizza = Pizza(["cheese", "tomato"]) print(pizza.pineapple_allowed) pizza.pineapple_allowed = True
False
AttributeError: can't set attribute
Como pueden observar, al tratar de cambiar el valor, se produce un error.
Las propiedades pueden también ser fijadas definiendo funciones de setter/getter.
Un setter fija el valor de una propiedad correspondiente.
Un getter toma el valor.
Para definir un establecedor, necesitamos utilizar un decorar con el mismo nombre que el de la propiedad, seguido de un punto y la palabra clase setter. Lo mismo aplica para los obtenedores, pero con la palabra clase getter.
A continuación les mostré un ejemplo de las propiedades. Utilizaremos la misma clase Pizza, la cual para cambiar el valor de toppings, se tendrá que cumplir alguna condición, en este caso, un contraseña.
class Pizza: def __init__(self, toppings): self.toppings = toppings self.__pineapple_allowed = False @property def pineapple_allowed(self): return self.__pineapple_allowed @pineapple_allowed.setter def pineapple_allowed(self, value): if value: password = input("Introduzca la contraseña: ") if password == "sw0rdf1sh": self.__pineapple_allowed = value else: raise ValueError("Alerta! Intruso!") pizza = Pizza(["chesse", "tomato"]) print(pizza.pineapple_allowed) pizza.pineapple_allowed = True print(pizza.pineapple_allowed)
False Introduzca la contraseña: sw0rdf1sh True
Como pueden observar, el valor a cambiado. Ahora, ¿Que pasaría si el usuario introduce una contraseña incorrecta?.
print(pizza.pineapple_allowed) pizza.pineapple_allowed = True print(pizza.pineapple_allowed)
True Introduzca la contraseña: s9ju2hn1
ValueError: Alerta! Intruso!
Como pueden observar, el programa lanza un error, el que nosotros mismo hemos programado.
¿Alguna duda? Entonces no dudes en dejar un comentario.
Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
-
Muy buena explicación, muchas gracias
Deja una respuesta
Muchas gracias Luis Salcedo