El método de cifrado

Vamos a crear ahora un método -al que vamos a llamar "cifra"- que cifre un mensaje de texto: tendrá que recorrer cada una de las letras de dicho mensaje calculando su índice en "alfabeto" y añadiendo a este índice la clave, para calcular a continuación el módulo con respecto a la longitud del alfabeto (ya sabes, para estar considerando siempre como nuevo índice una letra del mismo). Este método quedaría así:

def cifra(self, mensaje):
    mensaje_cifrado = ""
    for letra in mensaje:
        indice = CifradorCesar.alfabeto.index(letra) 
        nuevo_indice = (indice + self.clave) % len(CifradorCesar.alfabeto)
        mensaje_cifrado += CifradorCesar.alfabeto[nuevo_indice]
    return mensaje_cifrado

Comenzamos creando una variable ("mensaje_cifrado") para almacenar las letras una vez cifradas. En el bucle for extraemos el índice de cada letra a cifrar, calculamos el nuevo índice sumando la clave (a la que accedemos por medio de self.clave) y calculando el módulo con respecto a la longitud del alfabeto (al que accedemos por medio de CifradorCesar.alfabeto), y añadimos a "mensaje_cifrado" la letra con el nuevo índice. Finalmente devolvemos el mensaje cifrado.

La clase completa quedaría de la siguiente forma:

class CifradorCesar:
    
    import string
    alfabeto = string.printable
    
    def __init__(self, clave):
        self.clave = clave
        
    def cifra(self, mensaje):
        mensaje_cifrado = ""
        for letra in mensaje:
            indice = CifradorCesar.alfabeto.index(letra) 
            nuevo_indice = (indice + self.clave) % len(CifradorCesar.alfabeto)
            mensaje_cifrado += CifradorCesar.alfabeto[nuevo_indice]
        return mensaje_cifrado

Probémosla:

c = CifradorCesar(7)
c.cifra("Python para Data Science")

'WFAovu1whyh1KhAh1Zjplujl'

¡Parece que funciona!