#python
#python
Вопрос:
Я создал своего рода класс encoder, который принимает текстовые данные и преобразует их в целые числа и обратно.
Однако эта информация чувствительна к бизнесу, поэтому я не хочу, чтобы отображение декодера или кодировщика класса было вызываемым, если не введен определенный токен
например, я хотел бы что-то вроде приведенного ниже кода. Но поскольку все атрибуты и методы класса являются общедоступными (насколько мне известно) Я понятия не имею, как с этим бороться. Возможно ли это вообще?
import pickle
class EncoderDecoder:
# something happens here
# dump the class
# load the class
ed = EncoderDecoder(*args, **kwargs)
ed.encode(sentence) # raises some error
ed.decode(sentence) # raises some error
ed.set_token = "pasword1234"
ed.encode(sentence) # returns encoded
ed.decode(sentence) # returns decoded
# the user can't access set_token property setter or decoder method
Комментарии:
1. если вы хотите скрыть информацию, вам нужно оставить ненадежных пользователей за пределами вашего процесса. Не существует метода программирования, который мог бы вам помочь, если у пользователя есть разрешение на чтение адресного пространства памяти процесса, содержащего конфиденциальные данные.
2. Модификаторы доступа предназначены для скрытия реализации, а не секретов :), и в любом случае python не имеет никаких модификаторов доступа.
3. Я поддерживаю то, что говорит @geckos. Вы могли бы использовать самоанализ, чтобы взломать определение класса или объекта и, вероятно, выяснить, как сделать то, что вы просите. Но тогда то же самое мог бы сделать вызывающий ваш код. Опять же, как только кому-то разрешено запускать код в интерпретаторе Python, который имеет доступ к конфиденциальным данным, этот человек может найти способ получить доступ к этим данным, независимо от того, что вы делаете, чтобы скрыть методы или что-либо еще.
4. … чтобы ответить на ваш вопрос более конкретно… почему бы просто не вызвать сбой метода, если токен не был предоставлен первым? — на самом деле… Я только что заметил, что это то, что вы показываете в своем примере кода. Так что же в этом плохого? Я предполагаю, что вы знаете, как проверить наличие токена и вернуть ошибку или выдать исключение, если оно не было установлено.
5. Если вы говорите о доступности метода set_token… почему это имеет значение? Это должно быть конкретное значение токена, которое имеет значение. Если вызывающий объект знает об этом атрибуте и присваивает ему некоторое значение, но не правильное значение , то код должен просто завершиться ошибкой.
Ответ №1:
Вот простое решение, использующее то, как Python обрабатывает члены класса.
class Example:
def __init__(self):
self.method = None
def enable_method():
def method():
# do thing
pass
self.method = method
Это должно сработать за вас. Поскольку фактическое определение метода существует только в контексте enable_method
, оно недоступно извне. Поскольку Python не является типобезопасным, вы можете изменить self.method
тип функции с типа none без каких-либо проблем.
Надеюсь, это поможет!