Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Особенность импорта python


Автор: wind1 11.1.2013, 10:48
Допустим, у нас есть модуль "abc", который находится в каталоге проекта. В нем есть класс "MyClass".
Чтобы создать экземпляр класса "MyClass", нужно написать:
Код

from abc import MyClass
a = MyClass()


Почему нельзя без импорта сразу написать так?
Код

a = abc.MyClass()


Ведь в java можно в аналогичной ситуации написать:
Код

abc.MyClass a = new abc.MyClass();

И все будет работать.

С чем связана такая особенность?

Автор: 4ell 11.1.2013, 17:52
Ну для начала стоит отметить что в стандартной библиотеке уже есть модуль с таким именем, поэтому загружается он.
http://docs.python.org/2/library/abc.html

Такой пример работает
Код

#file a.py
import abcc

a = abcc.MyClass()
print(a)

#file abcc.py
class MyClass:
    def __repr__(self):
        return "Duck"

    def __str__(self):
        return "Duck"


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

Автор: wind1 11.1.2013, 20:39
Цитата(4ell @  11.1.2013,  17:52 Найти цитируемый пост)
Ну для начала стоит отметить что в стандартной библиотеке уже есть модуль с таким именем

Ну, имя модуля "abc" я привел как первое попавшееся в голову =) Пусть тогда будет не "abc", а "xyz" =)

Цитата(4ell @  11.1.2013,  17:52 Найти цитируемый пост)
А вопрос стоит ли подгружать модули автоматом или не стоит больше философский, питон позволяет это реализовать, если это необходимо.

Получается, в яве модули (вернее, не модули, а имена пакетов верхнего уровня) грузятся автоматом чтоли, без указания "import"?

Автор: 4ell 13.1.2013, 11:42
Я не сильно знаком с явой, но насколько помню, из каждого файла с исходником получается .class файл с байткодом и потом это все упаковывается в единый jar файл. И только после того как мы получили целостную программу виртуальная машина будет ее исполнять. Поправьте если где ошибся.
Питон же просто исполняет файл сходу. Тут нет понятия проекта, каждый файл сам по себе. Поэтому нужно явно указать какой модуль нужно импортировать.

Автор: SoWa 14.1.2013, 08:47
Нет, поправлю про Java.
Там тоже нужно явно прописывать импорт:
Код

import org.apache.cordova.*;

import android.os.Bundle;

И тут мы тоже видим и звездочки, и конкретные классы. Только структура проекта другая - каждый файл - класс. Классы объединены в пакеты. * импортирует все классы из этого пакета.
В питоне from xyz import * импортирует все классы из модуля xyz.

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

Автор: wind1 14.1.2013, 09:08
Цитата(SoWa @ 14.1.2013,  08:47)
Нет, поправлю про Java.
Там тоже нужно явно прописывать импорт:
Код

import org.apache.cordova.*;

import android.os.Bundle;

В яве импорт делается не для того, чтобы компилятор узнал, какой ресурс линковать/подгружать на исполнение, а для того, чтобы не писать каждый раз длинные пути.
То есть, я могу писать просто:
Код

android.os.Bundle varName = new android.os.Bundle()

Без предварительного импорта.

А если я в питоне попытаюсь такое сделать, то такой трюк не пройдет. Даже если я согласен буду в .py скрипте прописывать полные пути к классам, мне придется их сначала импортировать.

Автор: SoWa 14.1.2013, 16:55
Это так, но есть же негласные соглашения писать импорты, чтобы не плодить длинные портянки smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)