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

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

05.04.2019, 09:33. Показов 2616. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru