LINUX.ORG.RU

python: инстанс в модуле - это вообще законно?

 


0

2

Доброго времени суток

Начал изучать sqlalchemy

В официальной документации:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

Our application will usually have just one instance of this base in a commonly imported module

И вот тут я завис. Похоже, у меня пробел в академических знаниях о питоне. До сих пор я выносил в модули только классы и функции и понятия не имею что будет, когда в модуле окажется инстанс. Это вообще работает? Т.е. глупый вопрос, если б не работало, в документации бы этого не было

Но как, Холмс? Т.е. я в модулях и в __main__ могу импортировать модуль с инстансом, и это будет один и тот же инстанс, как будто я создал его в __main__ ? И в 2.7, и в 3.x?

★★★★★

Последнее исправление: router (всего исправлений: 2)

Ну да, а что вызвало удивление то? То что объекты могут быть в модулях? Ну так само собой, даже сишные либы оборачиваются в модулях. В либах в крестах тоже могут быть объекты и скорее всего есть. Вроде давно ты на ЛОР-е и в IT крутишься.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Ну да, а что вызвало удивление то?

Я не dev, я ops :) Меня заставляют писать код, окей, но программистом я от этого не стал.

Не могу понять, на каком этапе инстансы будут созданы в памяти. Т.е. будет ли это один и тот же объект при импорте модуля в других модулях, или при каждом импорте будет создан отдельный инстанс. Где можно почитать об этом подробнее?

router ★★★★★
() автор топика
Ответ на: комментарий от router

Не могу понять, на каком этапе инстансы будут созданы в памяти.

Если упрощенно, то когда интерпретатор доберётся до объекта, дёрнет его первый раз из стека вызовов, то он его и создаст. Хотя я не заморачивался и это очень примитивное понимание, ставить на то что оно правильное я бы не стал. Надо подождать тех, кто точно знает как оно работает. Ну или самому проверить.

Т.е. будет ли это один и тот же объект при импорте модуля в других модулях, или при каждом импорте будет создан отдельный инстанс.

Сам модуль, это Singleton, хотя возможно можно менять это поведение. Если ты про это. https://webdevblog.ru/realizaciya-shablona-singleton-v-python/

Там есть про то как модули работают, более-менее. К вечеру/ночи вренусь в тред и посмотрю что тут отпишут, самому интересно стало.

https://tproger.ru/translations/guide-into-python-imports/

peregrine ★★★★★
()

это вообще законно?

Законно, законов каких-либо государств это не нарушает.

Зачем коверкать русский язык и тащить англицизмы не к месту?

X512 ★★★★★
()
Ответ на: комментарий от router

Инстансы будут созданы в памяти, когда интерпретатор исполнит код модулей. Питон не Си, в Python весь код состоит из statement'ов. Когда модуль импортируется в первый раз, соответствующий файл загружается и код в нём выполняется, потом создаётся объект с именами, которые определил модуль.

В частности, ты можешь написать файл hello.py со строкой print("Hello, world!") и файл hello_import.py со строкой import hello, запустить python3 hello_import.py, и на экран выведется Hello, world!.

Собственно, функции и классы — это тоже инстансы определённых классов. И модуль после импорта становится инстансом определённого класса.

О том, как происходит импорт, модно почитать в https://docs.python.org/3/reference/import.html . В частности, один и тот же файл по умолчанию два раза исполняться не должен.

P.S. Я могу быть неправ, инфа без гарантии.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)

До сих пор я выносил в модули только классы и функции и понятия не имею что будет, когда в модуле окажется инстанc

по секрету: класс это тоже инстанс класса type

eternal_sorrow ★★★★★
()

Опираться на инициализацию в модулях — это антипаттерн. Которым, тем не менее, продолжают пользоваться снова и снова. В том же JS уже пришли к тому, что модули инициализируются всем скопом при загрузке приложения. В принципе, сфера JS потихоньку уже идет к инициализации при компиляции.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

В принципе, сфера JS потихоньку уже идет к инициализации при компиляции

О, JS стал компилируемым? Где вы такие забористые грибы берёте? Я тоже хочу.

peregrine ★★★★★
()

Непонятно, а что тебя смущает? В модуле может быть любой объект.

yvv ★★☆
()
Ответ на: комментарий от router

Т.е. будет ли это один и тот же объект при импорте модуля в других модулях, или при каждом импорте будет создан отдельный инстанс. Где можно почитать об этом подробнее?

Это будет один и тот же инстанс. Почитать подробнее можно в python tutorial.

yvv ★★☆
()

Считай что модуль это сам по себе большой class def __init__.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от peregrine

Вроде понял, спасибо. Пока буду использовать с осторожностью, до изучения документации по import

router ★★★★★
() автор топика
Ответ на: комментарий от peregrine

О, JS стал компилируемым? Где вы такие забористые грибы берёте? Я тоже хочу

Представь себе, кака в бэкэнде, так и на фронте активно используют трансляцию и компиляцию. Правда, обычно все-таки целевым языком является сам JS или его подмножество, а исходным языком — некий более высокоуровневый язык, в частности, надстройка над JS.

byko3y ★★★★
()

Какая разница, что ты там инстанс шлёпнешь, что ты какую-нибудь глобальную строку объявишь?

В сях же ты будешь выносить в ifndef какой нить хидер <config.h> и в ём нашлёпаешь горку строк

EXTERN string WORK_DIR; EXTERN string LOG_DIR;

Ну а тут, вынесен не объект типа string, считай в такой же конфиг, а объект типа sqlalchemy.ext.declarative -> declarative_base

Вот и всё…

anonymous
()
Ответ на: комментарий от byko3y

так и на фронте активно используют трансляцию и компиляцию

Починил тебя, играют в трансляцию и компиляцию.

anonymous
()
Ответ на: комментарий от anonymous

так и на фронте активно используют трансляцию и компиляцию

Починил тебя, играют в трансляцию и компиляцию

Да. Но это beta than nothing.

byko3y ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.