свойство класса не распознается при импорте

#python #class #import

#python #класс #импорт

Вопрос:

Я столкнулся с проблемой, когда импортированный класс не может распознать некоторые из своих собственных свойств. Ниже описывается класс в stringmanager.py

     class String_Manager:
        def __init__(self):
            self.jsonformat = None
            self.createjsonformat()


        def createjsonformat(self)
            with open("formatefile.json") as f:
                self.jsonformat = json.load(f)
            self.jsonformat["Server"] = "Server"
            self.jsonformat["Payload"] = "Payload"
            return copy.deepcopy(self.jsonformat)

    stringManager = String_Manager()
 

В другом месте импортируется stringManager

     from stringmanager import stringManager
    uploadtype = stringManager.jsonformat
 

Тем не менее, я получаю сообщение об ошибке, в котором говорится:
«Ошибка атрибута: объект ‘String_Manager’ не имеет атрибута ‘jsonformat’. Другие примеры, которые я рассмотрел, объясняют это неправильным наследованием сочетания табуляций и пробелов. Тем не менее, эта кодовая база, с которой я работаю, не использует родительские классы и придерживается стандартов PEP8, поэтому в ней нет комбинаций табуляции / пробела. Существуют ли какие-либо другие процедуры, которые необходимо соблюдать при импорте объекта из другого файла python?

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

1. Пожалуйста, опубликуйте фактический фрагмент кода, который вы пробовали . Это явно не реальный пример, потому что в нем есть опечатка stringManger . Поскольку вы не опубликовали реальный пример, который вы действительно пробовали , неясно, импортируете ли вы stringManager экземпляр или String_Manger класс.

Ответ №1:

Поскольку jsonformat атрибут вашего класса создается в __init__ функции, он будет существовать только в инициализированных экземплярах вашего класса, а не в чистом объекте класса. Вам нужно будет сделать uploadtype = String_Manager().jsonformat , чтобы оно работало.

РЕДАКТИРОВАТЬ: было правильно указано, что OP пытается импортировать сам экземпляр, и в этом случае мой ответ на самом деле не применим. Однако я не смог воспроизвести проблему, хотя есть проблема с исходным кодом, где jsonformat должно быть определено как словарь вместо None, иначе createjsonformat метод завершится с ошибкой.

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

1. Но он создает экземпляр String_Manager объекта как stringManager , а затем импортирует объект в

2. @wnnmaw, это то, что OP говорит , что он делает, но поскольку его код содержит простую опечатку, которая вызвала бы другую ошибку, мы не знаем, действительно ли это то, что он делает.

3. @Dan Я ценю, что вы указали на мои орфографические ошибки, и приношу извинения за то, что я не могу опубликовать исходный код. Как вы можете видеть, я новичок в сообществе stackoverflow и в настоящее время не знаю, что это было обязательным. wnnmaw правильно упомянул, что я пытаюсь импортировать созданный объект.

4. Даже если вы не можете опубликовать исходный код, опубликуйте полный, простой пример , который создает проблему, аналогичную той, которую вы описали (в качестве бонуса, вы можете выяснить, как решить свою собственную проблему на этом пути!). Ошибка, с которой вы столкнулись, не соответствует каким-либо значимым образом коду, который вы фактически опубликовали; Я попробовал, и он работает, как и ожидалось, после исправления орфографии. Таким образом, нам остается попытаться угадать, чем ваш фактический код отличается от кода, который вы опубликовали.

5. Решение, к которому я пришел, состояло в том, чтобы вручную вызвать вспомогательные функции, которые заполняют ‘self.jsonformat’ по какой-то причине они не выполнялись автоматически при создании экземпляра объекта stringManager. У меня сложилось впечатление, что функция init будет выполняться при вызове String_Manager() , но в моем случае функции, вложенные внутри init , не выполнялись. Не уверен, почему…