Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Особенность импорта python 
:(
    Опции темы
wind1
Дата 11.1.2013, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



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

from abc import MyClass
a = MyClass()


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

a = abc.MyClass()


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

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

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

С чем связана такая особенность?
PM MAIL   Вверх
4ell
Дата 11.1.2013, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



Ну для начала стоит отметить что в стандартной библиотеке уже есть модуль с таким именем, поэтому загружается он.
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"


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

Это сообщение отредактировал(а) 4ell - 11.1.2013, 17:55
PM MAIL   Вверх
wind1
Дата 11.1.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



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

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

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

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


Это сообщение отредактировал(а) wind1 - 11.1.2013, 20:42
PM MAIL   Вверх
4ell
Дата 13.1.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 17.9.2011

Репутация: 1
Всего: 1



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

Это сообщение отредактировал(а) 4ell - 13.1.2013, 11:44
PM MAIL   Вверх
SoWa
Дата 14.1.2013, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



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

import org.apache.cordova.*;

import android.os.Bundle;

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

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


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
wind1
Дата 14.1.2013, 09:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



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

import org.apache.cordova.*;

import android.os.Bundle;

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

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

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

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

Это сообщение отредактировал(а) wind1 - 14.1.2013, 09:13
PM MAIL   Вверх
SoWa
Дата 14.1.2013, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



Это так, но есть же негласные соглашения писать импорты, чтобы не плодить длинные портянки smile


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.