Recosh
@Recosh
Программист студент

Как правильно определять класс объекта принятого из сети в python?

Я так догадываюсь в питоне из за разных точек входа или нэймспейсов классы начинают отличаться. Но перейдём к простому примеру:
m2.py
import pickle
from m1 import Ab

if __name__ == '__main__':
    ab = Ab()

    with open('data.pickle', 'wb') as f:
        pickle.dump(ab, f)

m1.py
import pickle

class Ab:
    def __init__(self):
        pass

class DataReader:
    def __init__(self):
        pass

    def readPickle(self):
        with open('data.pickle', 'rb') as f:
            return pickle.load(f)

if __name__ == '__main__':
    ab = Ab()
    dataReader = DataReader()
    ab2 = dataReader.readPickle()
    print('ab', ab)
    print('ab2', ab2)

    if isinstance(ab, Ab):
        print('isinstance ab')

    if isinstance(ab2, Ab):
        print('isinstance ab2')

Для примера передачи из сети приведу пример передачи данных через файл
Сначала выполняется m2.py импортирует класс из модуля, сеарилизирует и сохраняет (типа сетевой пакет) в файл data.pickle
Далее выполняется m1.py, читает данные из файла и пытается определить принадлежат ли они классу. Вывод скрипта такой:
ab <__main__.Ab object at 0x03482E68>
ab2 <m1.Ab object at 0x0349C160>
isinstance ab


То есть тут видно, что у ab2 перед точкой написано m1 и, как я понял, из за этого не срабатывает второе условие if isinstance(ab2, Ab) и как в таком случае проверять принадлежность классу?

А в итоге хочу определять какого типа данные пришли из сети посредством ООП
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Не используйте pickle из внешних источников вообще: этот формат позволяет выполнять произвольный код при десериализации. Ну а если очень хочется, вынесите Ab в общий пакет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы