code in eine Klasse umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Beeennnnn
User
Beiträge: 1
Registriert: Freitag 12. März 2021, 21:34

Hallo,

Ich habe letztens ein Programm geschrieben.jetzt möchte ich dieses Programm in eine Klasse umwandeln.Wenn ich aber einfach eine Klasse davorsetze , alles einrücke und bei den(der) Funktion ein self einbaue kommt trotzdem eine Fehlermeldung. Ich bin kein Python Profi (eher ein Anfänger ), deshalb könnte es sein das mein Programm etwas unübersichtlich / schlecht geschrieben ist.

Code: Alles auswählen

class Brain():

    import random

    counter = 0


    random_helper = []
    helper_variable = 0

    password = ""

    generator_list = []
     
    generated_list_letters = []
    generated_list_numbers = []
    generated_list_sc = []

    #sc = special character

    list_letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    list_numbers = [1,2,3,4,5,6,7,8,9,0]
    list_sc = ["!","§","$","%","&","/","(",")","=","?","#"]


    def start_generating(self,bool_numbers = True, bool_letters = True , bool_sc = True , password_length = 12):
         
            while counter < password_length:
                generated_list_letters.append(random.choice(list_letters))
                generated_list_numbers.append(random.choice(list_numbers))
                generated_list_sc.append(random.choice(list_sc))
                
                if counter == 0 :
                    if bool_letters == True:
                        random_helper.append(1)
                    if bool_numbers == True:
                        random_helper.append(2)
                    if bool_sc == True:
                        random_helper.append(3)
                
                
                counter_twin = counter
                
                
                #print(counter_twin)
                
                helper_variable = random.choice(random_helper)
                if helper_variable == 1 and bool_letters == True:
                    generator_list.append(generated_list_letters[counter])
                if helper_variable == 2 and bool_numbers == True:
                    generator_list.append(str(generated_list_numbers[counter]))
                if helper_variable == 3 and bool_sc == True:
                    generator_list.append(generated_list_sc[counter])       
               
                global counter
                counter = counter +1
                
                if counter == password_length:
                    password = " " .join(generator_list)
                    print(password.replace(" ",""))
                    
                    

    start_generating(bool_numbers = True, bool_letters = True , bool_sc = True ,password_length = 12)

    #print(generated_list_letters)
    #print(generated_list_numbers)
    #print(generated_list_sc)
    #print(generator_list)
    print(password)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

So wird daraus keine Klasse.
Du hast nur eine Funktion. Das wird niemals eine (sinnvolle) Klasse. Was willst Du denn eigentlich erreichen?

Bevor Du mit Klassen anfängst, solltest Du erst einmal lernen, Funktionen zu schreiben. Benutze keine globalen Variablen.
Typen haben in Variablennamen nichts verloren.
Da Du eh nur mit Strings arbeiten willst, ist es nicht sehr geschickt in list_numbers Zahlen zu speichern.
Die ganzen Listen gibt es auch schon fertig im string-Modul.

Das, was Du da mit `counter` machst, ist das unübersichtlichste überhaupt.
Man initialisiert eine Variable direkt vor der Schleife und nicht irgendwo sonst.
Wenn Etwas eh nur beim ersten Schleifendurchgang (counter = 0) gemacht wird, dann schreib das doch vor die Schleife!
Wenn etwas nur beim letzten Schleifendurchgang gemacht wird (counter == password_length) macht, dann macht man das NACH der Schleife.
Warum erzeugst Du erst einen String, in dem alle Zeichen per Leerzeichen getrennt werden, um danach die Leerzeichen wieder herauszulöschen?
Und warum heißt die Funktion start_generating? Das Password ist danach ja sogar fertig.

Wir landen also bei dem hier:

Code: Alles auswählen

import random
import string

SPECIAL_CHARACTERS = "!§$%&/()=?#"

def generate_password(use_numbers=True, use_letters=True, use_special=True, password_length=12):
    random_helper = []
    if use_letters:
        random_helper.append(1)
    if use_numbers:
        random_helper.append(2)
    if use_special:
        random_helper.append(3)

    generated_letters = []
    generated_numbers = []
    generated_specials = []
    password = []
    for counter in range(password_length):
        generated_letters.append(random.choice(string.ascii_lowercase))
        generated_numbers.append(random.choice(string.digits))
        generated_specials.append(random.choice(SPECIAL_CHARACTERS))
                
        helper_variable = random.choice(random_helper)
        if helper_variable == 1:
            password.append(generated_letters[-1])
        if helper_variable == 2:
            password.append(generated_numbers[-1])
        if helper_variable == 3:
            password.append(generated_specials[-1])       
               
    return "".join(password)

password = generate_password()
print(password)
Dann ist es sehr umständlich, erst immer an Listen Zeichen, Zahlen und Buchstaben zu hängen, dann zu prüfen ob man überhaupt Zahlen, oder Buchstaben möchte, um dann anhand einer kryptischen Nummer eine von diesen Mengen auszuwählen um dann zum Schluß jeweils aus der passenden Liste das letzte Element zu nehmen.
Warum erzeugst Du nicht gleich nur das Zeichen, das du möchtest?

Wenn man das alles, was man nicht braucht, weglässt, kommt man bei dem heraus:

Code: Alles auswählen

def generate_password(use_numbers=True, use_letters=True, use_special=True, password_length=12):
    character_groups = []
    if use_letters:
        character_groups.append(string.ascii_lowercase)
    if use_numbers:
        character_groups.append(string.digits)
    if use_special:
        character_groups.append(SPECIAL_CHARACTERS)

    password = []
    for counter in range(password_length):
        group = random.choice(character_groups)
        password.append(random.choice(group))
    return "".join(password)
Antworten