#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 , не выполнялись. Не уверен, почему…