Понимание импорта [дубликат]

Перед вызовом метода экземпляра или переменной экземпляра ему нужен объект (экземпляр). Когда экземпляр переменной вызывается из статического метода, компилятор не знает, к какому объекту принадлежит эта переменная. Поскольку статические методы не имеют объекта (только одна копия всегда). Когда вы вызываете переменную экземпляра или методы экземпляра из метода экземпляра, она ссылается на объект this. Это означает, что переменная принадлежит к любому объекту, созданному, и каждый объект имеет свою собственную копию методов и переменных экземпляра.

Статические переменные отмечены как static, а переменные экземпляра не имеют определенного ключевого слова.

26
задан Blorgbeard 26 June 2009 в 05:22
поделиться

7 ответов

Используйте модуль pickle .

import pickle
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }
afile = open(r'C:\d.pkl', 'wb')
pickle.dump(d, afile)
afile.close()

#reload object from file
file2 = open(r'C:\d.pkl', 'rb')
new_d = pickle.load(file2)
file2.close()

#print dictionary object loaded from file
print new_d
53
ответ дан ecounysis 26 August 2018 в 21:55
поделиться
  • 1
    R '' обозначает необработанную строку, описанную здесь: docs.python.org/reference/lexical_analysis.html#string-literals . В основном это означает, что обратные косые черты в строке включаются как буквальные обратные косые черты, а не escape-символы (хотя исходная строка не может заканчиваться обратным слэшем). – Miles 26 June 2009 в 06:01
  • 2
    Я исправил пример: файл нужно открыть в двоичном режиме. Это все еще должно быть для Python 2, но это не сработает так резко. – Miles 26 June 2009 в 06:02
  • 3
    Убедитесь, что вы прочитали документацию Python (в том числе для соответствующей версии) и не просто полагаетесь на примеры! :) docs.python.org/3.0/library/pickle.html (Извините за комментарий спам!) – Miles 26 June 2009 в 06:05
  • 4
    Я сомневаюсь, что, поскольку ваш оригинальный пример не открыл файл в режиме записи. ;) Но что касается двоичного режима, то в Python 2 он может работать (поскольку бинарный флаг практически не влияет на Linux и OS X), но он не переносится и может столкнуться с проблемами в Windows, если результирующий файл содержит новую строку или DOS EOF персонажей. – Miles 26 June 2009 в 06:22
  • 5
    Технически травление будет работать для файлов текстового режима, если вы не используете бинарный формат рассола (т. Е. Протокол = 0), и вы используете его последовательно (т. Е. Также используйте текстовый режим для чтения). Использование двоичного кода, как правило, является лучшей идеей, особенно, если вы можете перемещать данные между платформами. – Brian 26 June 2009 в 07:49

Чтобы добавить к предыдущим предложениям, если вы хотите, чтобы формат файла был легко читаемым и изменяемым, вы также можете использовать YAML . Он отлично работает для вложенных dicts и списков, но масштабирует для более сложных структур данных (т. Е. С участием пользовательских объектов), а его большой плюс заключается в том, что формат доступен для чтения.

2
ответ дан Eli Bendersky 26 August 2018 в 21:55
поделиться

Вы также можете захотеть взглянуть на базу данных объектов Zope , тем сложнее вы получите :-) Наверное, излишнее то, что у вас есть, но оно хорошо масштабируется и не слишком сложно использовать.

4
ответ дан Jay Atkinson 26 August 2018 в 21:55
поделиться

Если вы хотите сохранить его в удобном для чтения формате в формате JSON, используйте repr для сериализации объекта и eval для десериализации его.

repr(object) -> string

Возвращает каноническое строковое представление объекта. Для большинства типов объектов eval(repr(object)) == object.

3
ответ дан John Kugelman 26 August 2018 в 21:55
поделиться
  • 1
    Рассмотрим ast.literal_eval () ( docs.python.org/library/ast.html#ast.literal_eval ) в качестве альтернативы eval (). – Miles 26 June 2009 в 05:33
  • 2
    Главное, что мне не нравится в этом решении, состоит в том, что у вас есть объект в структуре, где идентификатор eval (repr ()) не выполняется, функция repr () будет «успешной»; но тогда eval () будет barf. – Miles 26 June 2009 в 05:37
  • 3
    @John. Вы будете пилированы за этот ответ ... были S.Lott? – mhawke 26 June 2009 в 05:44
  • 4
    рассол, YAML, JSON и т. д., являются более безопасными и работают с большим количеством типов, чем этот метод. IMO, eval () следует избегать, когда это возможно. – Jason Creighton 26 June 2009 в 06:05
  • 5
    @ Джейсон: На ​​самом деле, рассол не является более безопасным, чем eval - вредоносный ввод может выполнять код так же легко, и здесь, по крайней мере, очевидно, что он делает это, поэтому я думаю, что downvoting это немного несправедливо. Есть и другие причины, чтобы избежать eval () (например, обрабатывает объекты с evalable repr () s и бесшумно теряет данные, если они не самоочевидны, как указал Майлз), но безопасность разумна, это не хуже рассола. – Brian 26 June 2009 в 07:57

Попробуйте модуль полки, который даст вам постоянный словарь, например:

import shelve
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }

shelf = shelve.open('shelf_file')
for key in d:
    shelf[key] = d[key]

shelf.close()

....

# reopen the shelf
shelf = shelve.open('shelf_file')
print(shelf) # => {'qwerty': [4, 5, 6], 'abc': [1, 2, 3]}
7
ответ дан mhawke 26 August 2018 в 21:55
поделиться

Возьмите свой выбор: Стандартная библиотека Python - Устойчивость данных . Какой из них наиболее подходит, может варьироваться в зависимости от ваших конкретных потребностей.

pickle , вероятно, является самым простым и наиболее способным, поскольку «записывать произвольный объект в файл и

Для наилучшей производительности травления (скорость и пространство) используйте cPickle в HIGHEST_PROTOCOL.

12
ответ дан Miles 26 August 2018 в 21:55
поделиться

JSON имеет ошибки, но когда он отвечает вашим потребностям, это также:

  • прост в использовании
  • , включенный в стандартную библиотеку поскольку интерфейс json module
  • несколько похож на pickle , который может обрабатывать более сложные ситуации
  • human- редактируемый текст для отладки, совместного использования и контроля версий
  • действительный код Python
  • , установленный в Интернете (если ваша программа касается любого из этого домена)
4
ответ дан user 26 August 2018 в 21:55
поделиться
  • 1
    JSON недействителен Python. Это выглядит так поверхностно, но используйте некоторые bools, и вы увидите проблему (JSON использует true и false, а Python использует True и False). Кроме того: массивы JSON (dicts) имеют только строковые ключи. Поэтому он не сохраняет структуру данных правильно. – Jürgen A. Erhard 17 June 2013 в 09:07
Другие вопросы по тегам:

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