Класс не возвращает одну из своих функций - PullRequest
0 голосов
/ 08 февраля 2020

Когда я запускаю следующий код, не заключая его в класс, обе функции выполняют именно то, что и ожидалось, что должно быть очевидно из приведенного ниже кода.

Однако, как только я собрал их в класс, только функция getPass фактически возвращает значение. Я ожидаю, что будут напечатаны две строки: одна с random string(password) и одна с зашифрованным string(password).

Что мне здесь не хватает? Я попытался включить self перед переменными в функции encryptPasswd, я попытался включить encryptPasswd в конструкторе (с self перед ним) и многие другие комбинации подобных тактик. Я не могу понять, почему он не возвращает зашифрованную строку. Пожалуйста помоги. Вот код (кстати, библиотека sqlite3 импортирована для последующего использования):

import string
import secrets
import sqlite3
from cryptography.fernet import Fernet


class generateEncyptedPasswd:
    def __init__(self):
        self.length = int(input("Enter the length of password: "))
        self.password = self.getPass(self.length)
        self.passwdInBytes = str.encode(self.password)
        self.encryptPasswd
        print(self.password)

    def getPass(self, length):
        return "".join(
            secrets.choice(
                string.ascii_uppercase
                + string.ascii_lowercase
                + string.digits
                + string.punctuation
            )
            for x in range(length)
        )

    def encryptPasswd(self, password):
        key = Fernet.generate_key()
        cipher = Fernet(key)
        passwd = self.passwdInBytes
        encryptedPasswd = cipher.encrypt(self.passwd)
        print(self.encryptedPasswd)

generateEncyptedPassw()

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Вы на самом деле не запускаете свой encryptPasswd в своем конструкторе.
Измените self.encryptPasswd на self.encryptPasswd() для вызова метода Вы также хотели бы изменить

encryptedPasswd = cipher.encrypt(self.passwd

на

self.encryptedPasswd = cipher.encrypt(self.passwd)

Поскольку вы хотите, чтобы переменная была переменной класса

Пример рабочего кода будет быть

import string
import secrets
import sqlite3
from cryptography.fernet import Fernet


class generateEncyptedPasswd:
    def __init__(self):
        self.length = int(input("Enter the length of password: "))
        self.password = self.getPass(self.length)
        self.passwdInBytes = str.encode(self.password)
        self.encryptPasswd()
        print(self.password)

    def getPass(self, length):
        return "".join(
            secrets.choice(
                string.ascii_uppercase
                + string.ascii_lowercase
                + string.digits
                + string.punctuation
            )
            for x in range(length)
        )

    def encryptPasswd(self):
        key = Fernet.generate_key()
        cipher = Fernet(key)
        passwd = self.passwdInBytes
        self.encryptedPasswd = cipher.encrypt(passwd)
        print(self.encryptedPasswd)


generateEncyptedPasswd()
0 голосов
/ 08 февраля 2020

Когда вы определяете класс, вы должны вызывать функции либо через метод __init__, либо через объект класса:

class Foo:
    def __init__(self):
        print("in constructor")

    def bar(self):
        print("in function")

Если вы делаете:

Foo()

Только in constructor отпечатков. Вы хотите выполнить одно из следующих действий:

class Foo:
    def __init__(self):
        print("in constructor")
        self.bar() # NOTICE HERE

    def bar(self):
        print("in function")

Выше будет вызываться bar() при инициализации объекта с помощью Foo(), или:

class Foo:
    def __init__(self):
        print("in constructor")

    def bar(self):
        print("in function")


f = Foo()
f.bar()

Выше будет вызывать функцию bar после инициализации объекта. Оба будут выводить:

in constructor
in function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...