Является ли плохой практикой или явно неправильным объявлять класс, у которого есть методы, возвращающие некоторое значение из другого класса в Python?

#python #class #design-patterns

Вопрос:

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

Вот фрагмент кода для Person:

 from RSA import RSA 

class Person:
    def __init__(self, name):
        self.name = name
        self._keys = None

    def generate_keys(self):
        self._keys = RSA.generate_keys()

    def sign(self, message):
        return RSA.sign(message, self._keys)

    def verify(self, recipent_pk, signature, message):
        return RSA.verify(recipent_pk, signature, message)
 

И фрагмент для RSA:

 class RSA:

    def generate_keys():
        private_key = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048,
            backend=default_backend()
        )
        return private_key

    def sign(message: int, private_key: rsa.RSAPrivateKey):
        bytes_msg = message_to_bytes(message)
        signature = private_key.sign(
            bytes_msg,
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return signature
 

Я спрашиваю, потому что Пайлинт кричит на меня за то, что я не объявляю себя первым параметром для каждого метода в RSA. Тем не менее, код прекрасно работает без его объявления, но я что-то упускаю здесь? Кроме того, message_to_bytes-это вспомогательная функция, используемая для преобразования входных данных из целого числа в байтовое представление. Нормально ли, что он выходит за пределы класса на уровне модуля, или мне нужно объявить его внутри класса RSA? (В настоящее время это работает, но кажется неправильным исходить из Java).

Комментарии:

1. Методы, которые не принимают self или cls в качестве первого параметра, должны быть объявлены @staticmethod

2. Это не имеет никакого отношения к типам возвращаемых данных.

3. Почему это RSA класс? Похоже, это должен быть просто модуль с функциями верхнего уровня.

4. В отличие от Java, вам не нужно объединять все в класс только потому, что для языка требуется ровно один класс на файл.

5. Недавно я узнал о разделении. Разве классу Person не должен быть предоставлен экземпляр класса RSA, например, через конструктор? Этот вопрос только для моего сведения.