<jupyter_start><jupyter_text>![imagenes](logo.png)  Métodos de clase y métodos de estáticos. Existen algunos casos en los que se requiera de extender o restringir el ámbito de un método. Los métodos de clase y los métodos estáticos son ejemplo de este tipo de casos.  Métodos de clase.Un método de clase puede modificar el estado de una clase, accediendo a los atributos de dicha clase, aún cuando el método es invocado desde un objeto. En lugar de definirse utilizando _self_ como primer parámetro, se utiliza _cls_. Los métodos de clase se definen con la siguiente sintaxis:```@classmethoddef (cls , ):  ...```**Ejemplo:**<jupyter_code>class PoblacionCensada():
    '''Clase capaz de registrar la cantidad de habitantes de todas sus instancias.'''
    poblacion = 0
    '''Crea censos de población. '''
    
    @classmethod
    def opera_poblacion(cls, operador, cantidad):
        '''Método de clase que registra el número total de población de todas las instancias de la clase.'''
        cls.poblacion = eval(str(cls.poblacion) + operador + str(cantidad))
    
    @classmethod
    def despliega_total(cls):
        '''Método de clase que despliega el atributo de clase cls. población.'''
        return cls.poblacion
    
    def __init__(self, nombre, numero=0):
        print("Se ha creado la población {} con {} habitantes.".format(nombre, numero))
        self.nombre = nombre
        self.poblacion = numero
        self.opera_poblacion('+', self.poblacion)   
    
    def __del__(self):
        self.opera_poblacion('-', self.poblacion) 
edomex = [PoblacionCensada("Tlalnepantla", 600000), PoblacionCensada("Toluca", 1000000),
         PoblacionCensada("Valle de Chalco", 750000), PoblacionCensada('Valle de Bravo', 100000)]
edomex[0].despliega_total()
PoblacionCensada.poblacion
edomex[0].poblacion
del edomex[1]
edomex[0].despliega_total()
for entidad in edomex:
    print(entidad.nombre, entidad.poblacion)
PoblacionCensada.poblacion<jupyter_output><empty_output><jupyter_text>Métodos estáticos.Los métodos estáticos están restringidos en su ámbito, de tal manera que no tienen acceso a los atributos del objeto. Se definen de forma idéntica a una función, sin necesidad de ingresar el parámetro inicial _self_.Sintaxis:```@staticmethoddef ():  ...  ```  **Ejemplo:**<jupyter_code>class Servidor:
    '''Clase que emula a un servidor muy básico.'''
    usuarios_activos = set(())
    
    def __init__(self, dominio, lista):
        self.lista_usuarios = lista
        self.dominio = dominio
    
    def conexion(self, usuario):
        '''Conexión de un usuario válido al servidor.'''
        if usuario in self.lista_usuarios:
            self.usuarios_activos.add(usuario)
        else:
            return False
        
    @staticmethod
    def ping(ip):
        '''Regresa el ping a la IP de origen.'''
        return (ip, "ping")        
server = Servidor("demo.pythonista.mx", ["josech", "juan", "mglez", "jklx"])
server.ping("172.16.31.10")
server.lista_usuarios
server.conexion('juan')
server.usuarios_activos<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10270622758395827, 'fraction_numerical': 0.013042060645582002, 'mean_word_length': 3.662613981762918, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 1, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '263601', 'license': 'MIT', 'n_tokens_mistral': 1118, 'n_tokens_neox': 1077, 'n_words': 300, 'path': 'C06_metodos_de_clase_y_estaticos.ipynb', 'repo_name': 'scidatmath2020/Programacion_orientada_objetos_Python', 'size': '3068'}