Google+ Seguidores

miércoles, 4 de julio de 2018

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.

No hay comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .