Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 28.05.2018
Сообщений: 6

Пространства имён

05.04.2019, 09:33. Показов 2576. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Бодрого времени суток. Python 3

Подскажите плиз по пространству имён.

Есть структура:

/
main.py
/foo
__init__.py
foo1.py
foo2.py

__init__.py пустая

foo 1 и 2 .py

Содержат классы:

foo1.py

Python
1
2
3
4
5
6
7
class Foo11:
    def __init__(self):
        self.var1 = 1
        self.var2 = 2
 
    def do_foo1(self):
        print ("Привет я из foo1")

foo2.py

Python
1
2
3
4
5
6
7
class Foo22:
    def __init__(self):
        self.var1 = 3
        self.var2 = 4
 
    def do_foo2(self):
        print ("Привет я из foo2")

Вопрос. Как мне необходимо импортировать модуль foo, что бы потом вызывать в main.py как то на подобие:

Python
1
2
3
4
5
a = foo.foo1.Foo11()
b= foo.foo2.Foo22()
 
a.do_foo1
b.do_foo2
На данный момент у меня получается импортировать только через
Python
1
import foo.foo1
Такой подход меня не устраивает так как классов(файлов) в модуле foo далеко не 2

Заранее благодарен за ответ, просьба санными тряпками не кидаться
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2019, 09:33
Ответы с готовыми решениями:

Socket.IO. Не работает разделение на пространства имен
Есть система вида --- --- . Источник данных подключается к серверу и отправляет новые данные бесконечно (при срабатывании события)....

Как правильно делать пространства имён?
Переписываю программу с C++ на python по той причине, что обнаружил для себя модуль bigfloat, позволяющий вручную задавать определённую...

Как запретить переименование пространства имен в xml?
Я обрабатываю xml документ c помощью lxml. Провожу поиск и замену значений тегов, но после сохранения происходит изменение пространства...

9
60 / 86 / 16
Регистрация: 25.03.2019
Сообщений: 235
05.04.2019, 14:07
Лучший ответ Сообщение было отмечено LexFall как решение

Решение

Если у вас пакет называется foo, то в __init__.py вы можете добавить примерно следующее:
Python
1
2
3
4
5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
from foo.foo1 import Foo11
from foo.foo2 import Foo22
И тогда, при обращении к пакету, вы можете делать так:
Python
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
 
import foo
 
 
if __name__ == '__main__':
    a = foo.Foo11()
1
1 / 1 / 0
Регистрация: 17.08.2017
Сообщений: 142
05.04.2019, 19:30
Может просто from paket import* использовать (понимаю , что не самый умный , так , что интересно в чем проблема).
0
60 / 86 / 16
Регистрация: 25.03.2019
Сообщений: 235
05.04.2019, 20:01
Цитата Сообщение от David099 Посмотреть сообщение
Может просто from paket import* использовать
Можно. Но не рекомендуется. Главным образом потому, что могут возникать конфликты имен из различных пространств имен, если импортировать все скопом.
0
1 / 1 / 0
Регистрация: 17.08.2017
Сообщений: 142
05.04.2019, 20:04
Так , проблема 1) в том , что нужно вызвать конкретные модули или 2) в то , что они вызываются одновременно ?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.04.2019, 20:14
Цитата Сообщение от David099 Посмотреть сообщение
проблема 1) в том
Что так делать не нужно. Потому что когда мы импортируем все сразу - получаем пространство имен с кучей имен, которые нам, скорей всего, нафиг не нужны. Импортировать нужно только то, что нужно в данном конкретном случае. Иначе "говнокод детектед" и "руки оторвать с корнем". В продакшен с таким говноподходом входа нет. Выбор за вами.
1
1 / 1 / 0
Регистрация: 17.08.2017
Сообщений: 142
05.04.2019, 20:18
Спасибо, очень помогли .
0
60 / 86 / 16
Регистрация: 25.03.2019
Сообщений: 235
05.04.2019, 20:24
Пример надуманный, но попробуйте добавить сверху в файл foo1.py:
Python
1
var3 = 30
Затем в файл foo2.py добавьте:
Python
1
var3 = 50
В __init__.py строки замените на следующие:
Python
1
2
from foo.foo1 import *
from foo.foo2 import *
А затем обратитесь к переменной var3 из другого кода:
Python
1
2
3
4
5
import foo
 
 
if __name__ == '__main__':
    print(foo.var3)
Окажется, что переменная var3 была переопределена вторым модулем.
0
1 / 1 / 0
Регистрация: 17.08.2017
Сообщений: 142
05.04.2019, 20:26
Спасибо, пример ясен.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.04.2019, 17:22
Цитата Сообщение от LexFall Посмотреть сообщение
Как мне необходимо импортировать модуль foo
Я вижу у Вас в структуре директорию /foo , но модуля foo.py не вижу.
У Вас только модули foo1.py и foo2.py .
Если Вы используете для импорта форму, from ... import ... , нужно строго отслеживать, что бы не было конфликта имен, к тому же помнить, какое имя из какого модуля.
Я сторонник тех, кто предпочитает использовать формат import ... as ... . Когда быстродействие не критично, то такой формат более удобен.
Кстати прежде чем создавать экземпляры, как делаете Вы
Python
1
2
a = foo.foo1.Foo11()
b= foo.foo2.Foo22()
нужно сначала импортировать модули с классами. Мой вариант импорта
Python
1
2
3
4
5
6
7
8
import foo.foo1 as fo1
import foo.foo2 as fo2
 
a = fo1.Foo11()
b= fo2.Foo22()
 
a.do_foo1
b.do_foo2
А для обеспечения полиморфизма Вы можете имена методов в обоих классах, если они выполняют однотипные действия, сделать одинаковыми, например do_foo.
И даже если Вы имена классов сделаете одинаковыми, хотя это и не рекомендуется, то при таком подходе все будет работать нормально.

Добавлено через 5 минут
Но имена классов могут оказаться одинаковыми, когда Вы импортируете модули созданные не только Вами.

Добавлено через 33 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
Вы можете имена методов в обоих классах, если они выполняют однотипные действия, сделать одинаковыми, например do_foo
Но в крупных проектах, что бы это не приводило к путанице можно использовать способ автоматического добавления к имени метода имени класса, к которому он принадлежит. Для этого к имени спереди добавляют два символа подчеркивания __X. Например __do_foo . Интерпретатор, когда встречает такое имя, автоматически добавляет спереди имя класса, к которому принадлежит данный метод.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2019, 17:22
Помогаю со студенческими работами здесь

В чем разница между подключением пространства имен в начале файла и внутри другого пространства имен?
Привет! Есть свой класс: namespace MyNamespace { public class MyClass { }

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

Имя типа или пространства имен отсутствует в пространстве имён
Доброго времени суток. Делаю пример SportsStore из книги "ASP.NET MVC 3 Framework с примерами на C# для профессионалов", Сандерс....

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Имя типа или пространства имен "ProtectedData" отсутствует в пространстве имен System.Security.Cryptography
Такая проблема, пытаюсь собрать проект , но дает ошибки : по идее, они должны идти в комплекте ... поискал в гугле, он он кидает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru