Как сделать класс в отдельном файле python
В Java код структурирован в пакеты с каждым классом в отдельном файле. Есть ли подобная практика в питоне? Лучше ли иметь каждый класс в отдельном файле Python и импортировать их друг другу, или я должен просто свалить мой код (все мои классы) в один файл?
4 ответа
В Java код структурирован в пакеты с каждым классом в отдельном файле. Есть ли подобная практика в питоне?
Определенно нет. На самом деле, Python не заставляет вас помещать весь ваш код в классы - обычные функции тоже хороши - так что даже предпосылка «каждый класс» не имеет смысла.
Лучше ли иметь каждый класс в отдельном файле Python
Определенно нет - это просто сделает ваш код кошмаром для обслуживания.
или я должен просто сбросить мой код (все мои классы) в один файл?
Ни один (если это не очень маленькое приложение). Вы хотите перегруппировать свой код (функции, классы и т. Д.) В сплоченные, разъединенные модули / пакеты, что в любом случае является известным передовым опытом для всех языков. Если у вас есть «полное» приложение с кодом домена, постоянством и пользовательским интерфейсом, вы, вероятно, захотите использовать его в качестве пакетов первого уровня.
По умолчанию python не создает один файл для каждого класса в файле кода.
Чтобы создать отдельный файл для каждого класса, его код каждого класса должен быть в отдельном файле
Если два класса связаны или тесно связаны, и клиентскому коду нужно будет создавать каждый из них, то лучше поместить их в один файл.
Если у одного родительского класса есть много дочерних классов, а у дочернего класса очень мало кода, лучше поместить его в один файл.
Это зависит от варианта использования / того, как вы хотите структурировать свой код / приложение.
Вот первая выдержка из документации классов:
По сравнению с другими языками программирования, механизм классов Python добавляет классы с минимумом нового синтаксиса и семантики. Это смесь механизмов классов, найденных в C++ и Modula-3 . питон классы предоставляют все стандартные функции объектно-ориентированного Программирование: механизм наследования классов допускает множественные базы классы, производный класс может переопределить любые методы своего базового класса или классы, и метод может вызвать метод базового класса с то же имя. Объекты могут содержать произвольные количества и виды данных. Как верно для модулей, классы имеют динамический характер Python : они создаются во время выполнения и могут быть изменены после создание.
В основном в Python «Все является объектом» кашель , включая занятия.
С учетом вышесказанного, если вы продолжите читать документы, есть случаи, когда вы захотите иметь несколько классов в одном файле, например, exceptions , поскольку они" тоже являются классами "
Нечто подобное можно поместить в файл, такой как errors.py
Или, если у вас есть класс, который переопределяет другой, например:
Примерно так может быть в одном файле с именем breeds.py .
По сути, теперь я сделал два питона модули, которые помогают сломать приложение на Python на кусочки размером с укус.
Поскольку ваша программа становится длиннее, вы можете разделить ее на несколько файлов для упрощения обслуживания. Вы также можете использовать удобную функцию, написанную в нескольких программах, без копирования ее определения в каждую программу.
В Python есть способ поместить определения в файл и использовать их в скрипте или в интерактивном экземпляре переводчика. Такой файл называется модулем; определения из модуля могут быть импортированы в другие модули или в основной модуль (набор переменных, которые вы иметь доступ к скрипту, выполненному на верхнем уровне и в калькуляторе режим) .
Модуль - это файл, содержащий определения и операторы Python. имя файла - это имя модуля с добавленным суффиксом .py.
Есть случаи, когда использование нескольких классов и определений в одном файле может быть удобным, но это зависит от того, как вы планируете структурировать свой проект. Конечно, вы можете поместить весь свой код в один файл, но это сложно управлять и идет вразрез с Zen of Python" Читаемость имеет значение ".
Python — объектно-ориентированный язык с начала его существования. Поэтому, создание и использование классов и объектов в Python просто и легко. Эта статья поможет разобраться на примерах в области поддержки объектно-ориентированного программирования Python. Если у вас нет опыта работы с объектно-ориентированным программированием (OOП), ознакомьтесь с вводным курсом или учебным пособием, чтобы понять основные понятия.
Создание классов
Оператор class создает новое определение класса. Имя класса сразу следует за ключевым словом class , после которого ставиться двоеточие:
- У класса есть строка документации, к которой можно получить доступ через ClassName.__doc__ .
- class_suite состоит из частей класса, атрибутов данных и функции.
Пример создания класса на Python:
- Переменная emp_count — переменная класса, значение которой разделяется между экземплярами этого класса. Получить доступ к этой переменной можно через Employee.emp_count из класса или за его пределами.
- Первый метод __init__() — специальный метод, который называют конструктором класса или методом инициализации. Его вызывает Python при создании нового экземпляра этого класса.
- Объявляйте другие методы класса, как обычные функции, за исключением того, что первый аргумент для каждого метода self . Python добавляет аргумент self в список для вас; и тогда вам не нужно включать его при вызове этих методов.
Создание экземпляров класса
Чтобы создать экземпляры классов, нужно вызвать класс с использованием его имени и передать аргументы, которые принимает метод __init__ .
Доступ к атрибутам
Получите доступ к атрибутам класса, используя оператор . после объекта класса. Доступ к классу можно получить используя имя переменой класса:
Теперь, систематизируем все.
При выполнении этого кода, мы получаем следующий результат:
Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любой момент.
Вместо использования привычных операторов для доступа к атрибутам вы можете использовать эти функции:
- getattr(obj, name [, default]) — для доступа к атрибуту объекта.
- hasattr(obj, name) — проверить, есть ли в obj атрибут name .
- setattr(obj, name, value) — задать атрибут. Если атрибут не существует, он будет создан.
- delattr(obj, name) — удалить атрибут.
Встроенные атрибуты класса
Каждый класс Python хранит встроенные атрибуты, и предоставляет к ним доступ через оператор . , как и любой другой атрибут:
Для вышеуказанного класса давайте попробуем получить доступ ко всем этим атрибутам:
Когда этот код выполняется, он возвращает такой результат:
Удаление объектов (сбор мусора)
Python автоматически удаляет ненужные объекты (встроенные типы или экземпляры классов), чтобы освободить пространство памяти. С помощью процесса ‘Garbage Collection’ Python периодически восстанавливает блоки памяти, которые больше не используются.
Сборщик мусора Python запускается во время выполнения программы и тогда, когда количество ссылок на объект достигает нуля. С изменением количества обращений к нему, меняется количество ссылок.
Когда объект присваивают новой переменной или добавляют в контейнер (список, кортеж, словарь), количество ссылок объекта увеличивается. Количество ссылок на объект уменьшается, когда он удаляется с помощью del , или его ссылка выходит за пределы видимости. Когда количество ссылок достигает нуля, Python автоматически собирает его.
Обычно вы не заметите, когда сборщик мусора уничтожает экземпляр и очищает свое пространство. Но классом можно реализовать специальный метод __del__() , называемый деструктором. Он вызывается, перед уничтожением экземпляра. Этот метод может использоваться для очистки любых ресурсов памяти.
Пример работы __del__()
Деструктор __del__() выводит имя класса того экземпляра, который должен быть уничтожен:
Когда вышеуказанный код выполняется и выводит следующее:
В идеале вы должны создавать свои классы в отдельном модуле. Затем импортировать их в основной модуль программы с помощью import SomeClass .
Наследование класса в python
Вместо того, чтобы начинать с нуля, вы можете создать класс, на основе уже существующего. Укажите родительский класс в круглых скобках после имени нового класса.
Класс наследник наследует атрибуты своего родительского класса. Вы можете использовать эти атрибуты так, как будто они определены в классе наследнике. Он может переопределять элементы данных и методы родителя.
Синтаксис наследования класса
Классы наследники объявляются так, как и родительские классы. Только, список наследуемых классов, указан после имени класса.
Python поддерживает объектно-ориентированную парадигму программирования, а это значит, что мы можем определить компоненты программы в виде классов.
Класс является шаблоном или формальным описанием объекта, а объект представляет экземпляр этого класса, его реальное воплощение. Можно провести следующую аналогию: у всех у нас есть некоторое представление о человеке - наличие двух рук, двух ног, головы, пищеварительной, нервной системы, головного мозга и т.д. Есть некоторый шаблон - этот шаблон можно назвать классом. Реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.
С точки зрения кода класс объединяет набор функций и переменных, которые выполняют определенную задачу. Функции класса еще называют методами. Они определяют поведение класса. А переменные класса называют атрибутами - они хранят состояние класса
Класс определяется с помощью ключевого слова class :
Для создания объекта класса используется следующий синтаксис:
Например, определим простейший класс Person, который будет представлять человека:
Класс Person определяет атрибут name, который хранит имя человека, и метод display_info, с помощью которого выводится информация о человеке.
При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self (в ряде языков программирования есть своего рода аналог - ключевое слово this). Через эту ссылку внутри класса мы можем обратиться к методам или атрибутам этого же класса. В частности, через выражение self.name можно получить имя пользователя.
После определения класс Person создаем пару его объектов - person1 и person2. Используя имя объекта, мы можем обратиться к его методам и атрибутам. В данном случае у каждого из объектов вызываем метод display_info() , который выводит строку на консоль, и у второго объекта также изменяем атрибут name. При этом при вызове метода display_info не надо передавать значение для параметра self.
Конструкторы
Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который неявно имеют все классы:
Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() . К примеру, изменим класс Person, добавив в него конструктор:
В качестве первого параметра конструктор также принимает ссылку на текущий объект - self. Нередко в конструкторах устанавливаются атрибуты класса. Так, в данном случае в качестве второго параметра в конструктор передается имя пользователя, которое устанавливается для атрибута self.name . Причем для атрибута необязательно определять в классе переменную name, как это было в предыдущей версии класса Person. Установка значения self.name = name уже неявно создает атрибут name.
В итоге мы получим следующий консольный вывод:
Деструктор
После окончания работы с объектом мы можем использовать оператор del для удаления его из памяти:
Стоит отметить, что в принципе это необязательно делать, так как после окончания работы скрипта все объекты автоматически удаляются из памяти.
Кроме того, мы можем определить определить в классе деструктор, реализовав встроенную функцию __del__ , который будет вызываться либо в результате вызова оператора del, либо при автоматическом удалении объекта. Например:
Определение классов в модулях и подключение
Как правило, классы размещаются в отдельных модулях и затем уже импортируются в основой скрипт программы. Пусть у нас будет в проекте два файла: файл main.py (основной скрипт программы) и classes.py (скрипт с определением классов).
В файле classes.py определим два класса:
В дополнение к классу Person здесь также определен класс Auto, который представляет машину и который имеет метод move и атрибут name. Подключим эти классы и используем их в скрипте main.py :
Подключение классов происходит точно также, как и функций из модуля. Мы можем подключить весь модуль выражением:
Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.
Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.
Подключение модуля из стандартной библиотеки
Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:
После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.
После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math:
Стоит отметить, что если указанный атрибут модуля не будет найден, возбудится исключение AttributeError. А если не удастся найти модуль для импортирования, то ImportError.
Использование псевдонимов
Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.
Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math).
Инструкция from
Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:
Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as.
Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:
Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Для примера импортируем все атрибуты из модуля sys:
Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.
Создание своего модуля на Python
Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:
Теперь в этой же папке создадим другой файл, например, main.py:
Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:
Как назвать модуль?
Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании.
Читайте также: