Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Количество классов в одном файле .py

14.07.2018, 17:40. Показов 7869. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Правильно ли размещать в каждом файле по одному классу (как здесь)? Спрашиваю так как не уверен правильно ли делать так (хотя в C# так нормально).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2018, 17:40
Ответы с готовыми решениями:

несколько классов в одном файле (ООП)
даны классы комплексных чисел и векторов, нужно "соединить" их в одном проекте Выдает ошибку невозможно преобразовать ComplexNumber в...

Подсчитать количество классов в файле
Вопрос такого плана: Есть файл в котором определено некоторое кол-во классов, которое неизвестно и может быть любым. Подскажите каким...

Ошибка "Тип "MyPoint" создан из нескольких разделенных классов в одном и том же файле." при открытии дизайнера
Добрый день, формучане. У меня возникла необходимость добавления моего класса в коллекцию, для этого создал Generic класс. Но студия пишет...

15
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.07.2018, 17:51
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
хотя в C# так нормально
Нет. Разве что в самой CLR, где один класс это тысячи строк кода.

Никто не делит код просто на классы. Код распределяют по модулям.
А модуль это коробка с гомогенным\похожим\взаимосвязным содержимым.
В C# делают точно также. Как и в любом ЯП.
Распихивание каждого класса по отдельному файлу без декомпозиционной\архитектурной необходимости - бессмысленно.
Если я напишу 100 классов - кому-то будет по приколу потом ковыряться в сотне файлов?
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 17:53  [ТС]
Garry Galler, если подробней, то у меня один класс = один файл в C#. Причём, классы объединяются соответствующие пространства имён. И каждому пространству имён соответствует одноименная папка. Например:
Миниатюры
Количество классов в одном файле .py  
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
14.07.2018, 18:09
Цитата Сообщение от Garry Galler Посмотреть сообщение
В C# делают точно также. Как и в любом ЯП.
поспешный вывод, в Джаве тоже 1 класс в одном файле, исключение -вложенные классы. Да файлов много, они формируются по пакетам, все понятно.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 18:39  [ТС]
Как я понял, в Python так делать не стоит.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
14.07.2018, 19:45
Volobuev Ilya, я по привычке так и в питоне делаю, мне так понятнее )
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 20:03  [ТС]
Welemir1, в Python же нет пространств имён, чтобы можно было логически группировать классы, а потом разом импортировать. И да, а если классы находятся в файлах, которые вложены в папку, вложенную в текущую папку, то как их импортировать?
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
14.07.2018, 20:36
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
если классы находятся в файлах, которые вложены в папку, вложенную в текущую папку, то как их импортировать?
В папке создать файл __init__.py, а в нем __all__ = перечислить пакеты, тогда можно будет просто import название_папки
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 20:39  [ТС]
ТабуретY, точнее, я создаю в главной папке этот файл, в нем пишу после __all__ имена файлов дочерней папке? И тогда из любого файла, который в главной папке, можно будет писать import название дочерней папки?
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
14.07.2018, 20:50
Только __all__ = ['first', 'second'] и обращаться from название_дочерней_папки.first import * и т.д.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
14.07.2018, 20:51  [ТС]
ТабуретY, а что делать, если несколько дочерних папок?
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
14.07.2018, 20:55
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

В каждой свой __init__.py
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.07.2018, 21:36
Цитата Сообщение от Welemir1 Посмотреть сообщение
в Джаве тоже 1 класс в одном файле
А какая в этом необходимость? Группировка по модулям должна быть логической, а не классовой. В C# я никогда не группировал ничего по классам исходя только из принципа "один класс - один файл" - там в этом нет никакой необходимости.
И В Java это тоже, как я понял, считается крайностью:

The first three package principles are about package cohesion, they tell us what to put inside packages:
REP The Release Reuse Equivalency Principle The granule of reuse is the granule of release.
CCP The Common Closure Principle Classes that change together are packaged together.
CRP The Common Reuse Principle Classes that are used together are packaged together.

Добавлено через 10 минут
Ну да, в этих правилах говорится о пакетах: пакет может состоять из нескольких файлов, но зачем размазывать именно каждый класс по файлу?! Неужели рекомендации по дизайну кода на Java советуют именно это?

Добавлено через 8 минут
И, в любом случае, в python подход "один класс - один файл" не имеет никакой обоснованной необходимости. Код разделяют на модули, содержащие блоки объединенные общей логикой (а блоки могут состоять из множества классов и просто функций), а набор этих модулей объединятся в пакет.

К тому же система импорта в python довольно запутана и непроста для понимания, так что чем меньше ты делишь код на мелкие субмодули, чем меньше уровней вложенности у твоих пакетов - ты меньше боли получаешь :-)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
15.07.2018, 10:23
Цитата Сообщение от Garry Galler Посмотреть сообщение
Группировка по модулям должна быть логической, а не классовой.
она таковой и является, скажем пакадж содержит все классы, которые работают с сетью, второй для БД и так далее

Цитата Сообщение от Garry Galler Посмотреть сообщение
И В Java это тоже, как я понял, считается крайностью:
нет не является. Физически в файле может быть ТОЛЬКО 1 класс с модификатором public, без модификатора ты там можешь создать и больше классов, но классы без модификаторы доступны ТОЛЬКО в этом пакете. Если тебе из другого пакета нужен будет этот класс, то придется делать его public и выносить в отдельный файл. Поэтому общепринято, что в файле только 1 класс, исключение -вложенные классы ну или как сказано выше -те, что нужны только в этом пакете.

Цитата Сообщение от Garry Galler Посмотреть сообщение
размазывать именно каждый класс по файлу?
не понял тебя, какое размазывание? вот файлик, в нем короткий, читаемый класс. Наоборот, есть свое удобство -открыть пакет и по именам файлов понят что в них за классы, и т.п. А если у тебя куча классов в одном файле, то придется во-первых какое то общее название давать, во-вторых, нужно его открывать и скроллить, чтобы узнать что там.


Но я не спорю, что в питоне так удобнее, тут многие вещи решаются проще, в том числе с импортами и отсутствием необходимости вообще создавать классы
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.07.2018, 12:14
Цитата Сообщение от Welemir1 Посмотреть сообщение
вот файлик, в нем короткий, читаемый класс. Наоборот, есть свое удобство
Может быть самим джава-программистам это удобно и привычно, но не думаю, что с этим согласятся программисты на других ЯП.
В Java это следствие дизайна языка, чтобы не было конфликта имен и т.д., двухуровневая инкапсуляция Пакет-> класс.
В 9-ке, как я понял, добавили еще один уровень и теперь сами пакеты можно группировать в модули. Но старый классовый подход остался как есть.
Кстати, в Scala и Kotlin от дизайна "один public класс - один файл" отказались.
Ведь класс как может иметь самодостаточный функционал, так и нет, будучи тесно связанным с другим.
И как раз проще (ИМХО) иметь эти два\три\четыре и т.д. класса, связанные одной логикой\функциональностью, в одном файле, чтобы ничего не искать по директории и не открывать код в десятке вкладок редактора.
Цитата Сообщение от Welemir1 Посмотреть сообщение
во-вторых, нужно его открывать и скроллить, чтобы узнать что там
В средах разработки любое имя\определение ищется по хоткею, выделяется по хоткею, показывается по хоткею, изменяется по хоткею. Скроллить это если ты в простых блокнотах работаешь.

Цитата Сообщение от Welemir1 Посмотреть сообщение
А если у тебя куча классов в одном файле, то придется во-первых какое то общее название давать
В python это и называется модуль, а имя, как правило, связано с его внутренним функционалом\назначением. Модуль может быть контейнером сразу для всего функционала (если его дробление архитектурно нецелесообразно), а может быть разделен на нескольких файлов-модулей и объединяться общим пакетом.
Класс же это просто единица переиспользования - нет никакого необходимости (кроме жесткого дизайна языка) пихать его в отдельный файл.
К тому же группировка по классам не есть группировка по логике.

В C# группировка кода с классами идет через пространство имен и создавать на каждый чих не приватный класс отдельный файл (для предотвращения конфликта имен) нет необходимости.
Хотя, если очень хочется, можно даже один класс размазать на несколько файлов :-) - это так называемый partial class.
В Go, пакет как и в Java это директория с файлами, в которых объявлена директива package имя_пакета и все файлы с таким объявлением будут автоматически иметь общее пространство имен и могут импортироваться по имени общей директории. И здесь тоже группировка кода никак не привязана к публичным классам.... которых, кстати, в Go нет, а есть типы и легковесные структуры :-)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
15.07.2018, 12:19
Цитата Сообщение от Garry Galler Посмотреть сообщение
любое имя\определение ищется по хоткею, выделяется по хоткею, показывается по хоткею, изменяется по хоткею.
это отлично работает и для
Цитата Сообщение от Garry Galler Посмотреть сообщение
ничего не искать по директории и не открывать код в десятке вкладок редактора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2018, 12:19
Помогаю со студенческими работами здесь

Можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле?
Подскажите, плз, можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле? (который лежит на другом...

Как передать значение переменной PHP в одном файле в переменную JS в другом файле?
Подскажите пожалуйста, как передать значение PHP из одного файла в JS в другом. Везде облазил. Варианта только два. Но Cookies не работают...

Дан текстовый файл. Определить количество слов в файле. Сформировать другой файл, записав в каждой его в строке по одном
Дан текстовый файл. Определить количество слов в файле. Сформировать другой файл, записав в каждой его в строке по одному слову из...

Сравнение слов в одном файле со словами в другом файле
Здравствуйте! Суть задачи такая: 1. Первый файл - запросы с городами, второй файл - база городов РФ. Оба txt 2. Найти в запросах все...

Сравнение слов в одном файле со словами в другом файле
Здравствуйте! Суть задачи такая: 1. Первый файл - запросы с городами, второй файл - база городов РФ. Оба txt (для Excel пусть не файлы,...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru