Создание контактной книги на Python с использованием объектно-ориентированного программирования и SQLite

Эта статья посвящена разработке контактной книги на Python с использованием объектно-ориентированного программирования (ООП) и базы данных SQLite. Мы рассмотрим основы языка Python и ООП, введем базовые понятия SQLite, затем спроектируем и реализуем контактную книгу с нуля, включая тестирование и отладку приложения.

Цель этой статьи – предоставить читателям четкое руководство по созданию полноценной контактной книги, используя современные подходы к программированию и базам данных. Разобравшись с материалом, вы сможете применять аналогичный подход для разработки более сложных приложений.

Основы Python и объектно-ориентированного программирования

1.1 Краткий обзор Python

Python — это высокоуровневый язык программирования с динамической типизацией и автоматическим управлением памятью. Его синтаксис прост и лаконичен, что делает его отличным выбором для быстрого прототипирования и разработки. Python поддерживает парадигмы процедурного, объектно-ориентированного и функционального программирования.

Язык широко используется как для задач веб-разработки, анализа данных и машинного обучения, так и для автоматизации системных задач. В 2023 году Python продолжает оставаться одним из самых популярных языков программирования благодаря своей универсальности и богатой экосистеме библиотек.

1.2 Что такое объектно-ориентированное программирование?

Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции «объектов». Объекты — это экземпляры классов, которые могут содержать данные (атрибуты) и функции (методы).

Основные принципы ООП включают:

  • Инкапсуляцию: скрытие внутренней реализации и предоставление интерфейса для взаимодействия.
  • Наследование: создание нового класса на базе существующего для повторного использования кода.
  • Полиморфизм: использование единообразного интерфейса для разных типов объектов.

Эти принципы помогают организовать код, сделать его более поддерживаемым и расширяемым.

1.3 Классы и объекты в Python

В Python класс создается с использованием ключевого слова class. Пример класса и объекта в Python:

class Contact:
    def __init__(self, name, phone, email):
        self.name = name
        self.phone = phone
        self.email = email

    def display_contact(self):
        print(f"Name: {self.name}, Phone: {self.phone}, Email: {self.email}")


# Создание объекта
contact = Contact("Alice", "1234567890", "alice@example.com")
contact.display_contact()

В этом примере мы создали класс Contact с конструктором __init__ для инициализации атрибутов и методом display_contact для вывода информации о контакте.

Введение в SQLite

2.1 Что такое SQLite?

SQLite — это легковесная реляционная база данных, которая сохраняет данные в одном файле на диске. Она не требует отдельного сервера для управления базами данных, что делает её идеальной для встраивания в приложения.

Преимущества SQLite:

  • Компактность и простота в использовании
  • Высокая производительность для небольших и средних приложений
  • Легкая интеграция с Python посредством библиотеки sqlite3

2.2 Установка и настройка SQLite

SQLite уже включен в стандартную библиотеку Python, поэтому дополнительных шагов для установки не требуется. Чтобы начать работу, достаточно импортировать модуль sqlite3:

import sqlite3

# Подключение к базе данных или создание новой
conn = sqlite3.connect('contacts.db')

# Создание курсора для выполнения SQL-запросов
cursor = conn.cursor()

Этот код создаст или подключится к файлу contacts.db.

2.3 Основные операции с базой данных

Основные операции с базой данных называются CRUD (Create, Read, Update, Delete). Пример создания таблицы в SQLite и выполнения операций CRUD:

# Создание таблицы
cursor.execute("""CREATE TABLE IF NOT EXISTS contacts
                  (id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT)""")

# Вставка данных
cursor.execute(
    "INSERT INTO contacts (name, phone, email) VALUES (?, ?, ?)",
    ("Alice", "1234567890", "alice@example.com"),
)

# Чтение данных
cursor.execute("SELECT * FROM contacts")
print(cursor.fetchall())

# Обновление данных
cursor.execute("UPDATE contacts SET phone = ? WHERE name = ?", ("0987654321", "Alice"))

# Удаление данных
cursor.execute("DELETE FROM contacts WHERE name = ?", ("Alice",))

# Сохранение изменений и закрытие соединения
conn.commit()
conn.close()

Проектирование контактной книги

3.1 Определение сущностей и атрибутов

В контексте контактной книги сущностью будет «Контакт». Атрибуты контакта могут включать:

  • Имя (name)
  • Телефон (phone)
  • Email (email)

Эти атрибуты будут храниться в базе данных и использоваться в наших классах для представления контактной информации.

3.2 Архитектура приложения

Приложение будет состоять из следующих основных компонентов:

  • Класс Contact: для представления индивидуального контакта
  • Класс ContactBook: для управления коллекцией контактов и взаимодействия с базой данных
  • База данных SQLite: для хранения контактной информации

Вот пример структуры классов:

class Contact:
    def __init__(self, name, phone, email):
        self.name = name
        self.phone = phone
        self.email = email


class ContactBook:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()
        self.create_table()

    def create_table(self):
        self.cursor.execute("""CREATE TABLE IF NOT EXISTS contacts
                               (id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT)""")

    # Методы для работы с контактами

Реализация контактной книги

4.1 Создание класса Contact

Класс Contact будет представлять индивидуальную запись и включать базовые атрибуты:

class Contact:
    def __init__(self, name, phone, email):
        self.name = name
        self.phone = phone
        self.email = email

    def __str__(self):
        return f"Name: {self.name}, Phone: {self.phone}, Email: {self.email}"

Этот класс инкапсулирует всю информацию о контакте и предоставляет метод для строкового представления объекта.

4.2 Создание интерфейса для работы с контактами

Класс ContactBook будет включать методы для добавления, удаления, изменения и просмотра контактов:

class ContactBook:
    def __init__(self, db_name="contacts.db"):
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()
        self.create_table()

    def create_table(self):
        self.cursor.execute("""CREATE TABLE IF NOT EXISTS contacts
                               (id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT)""")

    def add_contact(self, contact):
        self.cursor.execute(
            "INSERT INTO contacts (name, phone, email) VALUES (?, ?, ?)",
            (contact.name, contact.phone, contact.email),
        )
        self.conn.commit()

    def remove_contact(self, contact_id):
        self.cursor.execute("DELETE FROM contacts WHERE id = ?", (contact_id,))
        self.conn.commit()

    def update_contact(self, contact_id, new_contact):
        self.cursor.execute(
            "UPDATE contacts SET name = ?, phone = ?, email = ? WHERE id = ?",
            (new_contact.name, new_contact.phone, new_contact.email, contact_id),
        )
        self.conn.commit()

    def get_all_contacts(self):
        self.cursor.execute("SELECT * FROM contacts")
        rows = self.cursor.fetchall()
        return [Contact(name=row[1], phone=row[2], email=row[3]) for row in rows]

Мы создали методы для всех операций CRUD и реализовали их взаимодействие с базой данных.

4.3 Интеграция с SQLite

Интеграция уже частично покрыта в предыдущих разделах. Важно также позаботиться о корректном закрытии соединения с базой данных:

def close(self):
    self.conn.close()

При завершении работы с объектом ContactBook стоит вызывать этот метод для безопасного закрытия соединения.

Тестирование и отладка приложения

5.1 Методы тестирования кода

Для тестирования можно использовать встроенные модули unittest или pytest для более комплексного подхода. Пример тестирования:

import unittest


class TestContactBook(unittest.TestCase):
    def setUp(self):
        self.book = ContactBook(":memory:")  # Using in-memory database for tests

    def test_add_contact(self):
        contact = Contact("Alice", "1234567890", "alice@example.com")
        self.book.add_contact(contact)
        contacts = self.book.get_all_contacts()
        self.assertEqual(len(contacts), 1)
        self.assertEqual(contacts[0].name, "Alice")

    def tearDown(self):
        self.book.close()


if __name__ == "__main__":
    unittest.main()

Этот пример демонстрирует базовое создание и удаление тестовой базы данных в памяти.

5.2 Использование логирования

Для логирования в Python лучше использовать модуль logging. Он предоставляет гибкие возможности для отслеживания выполнения программы и диагностики проблем:

import logging

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)


# Использование логирования в методах
def add_contact(self, contact):
    try:
        self.cursor.execute(
            "INSERT INTO contacts (name, phone, email) VALUES (?, ?, ?)",
            (contact.name, contact.phone, contact.email),
        )
        self.conn.commit()
        logger.info(f"Contact {contact.name} added successfully.")
    except Exception as e:
        logger.error("Failed to add contact", exc_info=True)

Заключение

Мы рассмотрели процесс создания контактной книги на Python с использованием основ объектно-ориентированного программирования и базы данных SQLite. В ходе статьи мы изучили базовые концепции Python и ООП, основные операции с базой данных SQLite, а также спроектировали и реализовали контактную книгу. В заключительных разделах мы рассмотрели важность тестирования и логирования для повышения надежности и прозрачности нашего приложения.

Эти знания могут быть расширены и адаптированы для создания более сложных приложений, включающих различные функциональные возможности и работающих с более сложными структурами данных.


Добавить комментарий