Введение
В этой лабораторной работе вы изучите основные концепции Объектно-Ориентированного Программирования (ООП) на Python. Мы рассмотрим, как определять классы, которые служат шаблонами (blueprint) для создания объектов, и поймем взаимосвязь между классами и объектами.
Вы получите практический опыт, создавая и используя экземпляры (instances) определенных вами классов. Лабораторная работа проведет вас через инициализацию объектов с помощью метода __init__ для установки их начального состояния и настройку их строкового представления с помощью метода __repr__ для улучшения отладки и читаемости.
Определение класса и создание экземпляра
На этом шаге вы узнаете, как определить базовый класс и создать из него объект, или экземпляр.
В Объектно-Ориентированном Программировании класс (class) — это шаблон для создания объектов. Он определяет набор атрибутов (данных) и методов (функций), которыми будут обладать созданные объекты. Объект (object) — это экземпляр класса, конкретная сущность, построенная по шаблону класса.
Начнем с создания простого класса Dog.
Сначала откройте файл dog.py в проводнике файлов слева в WebIDE. В настоящее время этот файл пуст.
Теперь добавьте следующий код в dog.py для определения класса Dog, создания экземпляра и его использования:
## Define a simple Dog class
class Dog:
## Class attribute
species = "Canis familiaris"
## Method
def bark(self):
print("Woof!")
## Create an instance (object) of the Dog class
my_dog = Dog()
## Access the class attribute using the instance
print(f"The species is: {my_dog.species}")
## Call the instance's method
print("The dog says:")
my_dog.bark()
Разберем этот код:
class Dog:: Эта строка определяет новый класс с именемDog.species = "Canis familiaris": Это атрибут класса (class attribute). Его значение общее для всех экземпляров классаDog.def bark(self):: Это определяет метод (method), который является функцией внутри класса. Параметрself— это ссылка на текущий экземпляр класса и используется для доступа к переменным, принадлежащим классу.my_dog = Dog(): Эта строка создает новый экземпляр классаDogи присваивает его переменнойmy_dog.my_dog.species: Мы обращаемся к атрибутуspeciesобъектаmy_dogс помощью точечной нотации.my_dog.bark(): Мы вызываем методbarkу объектаmy_dog. Python автоматически передает объектmy_dogв качестве аргументаselfметоду.
Сохраните файл. Чтобы запустить ваш скрипт, откройте терминал в WebIDE и выполните следующую команду:
python dog.py
Вы должны увидеть следующий вывод, подтверждающий, что ваш объект был создан, а его атрибут и метод были успешно вызваны.
The species is: Canis familiaris
The dog says:
Woof!
Инициализация объектов с помощью метода __init__
В то время как атрибуты класса общие для всех экземпляров, часто требуется, чтобы каждый экземпляр имел свои уникальные данные. Метод __init__ — это специальный метод в классах Python, который действует как конструктор. Он автоматически вызывается при создании нового экземпляра, позволяя инициализировать его уникальные атрибуты.
Давайте модифицируем класс Dog, чтобы у каждой собаки были уникальные имя и порода.
Снова откройте файл dog.py и замените его содержимое следующим кодом:
## Define a Dog class with an __init__ method
class Dog:
## Class attribute
species = "Canis familiaris"
## The __init__ method (constructor)
def __init__(self, name, breed):
## Instance attributes
self.name = name
self.breed = breed
## Method
def bark(self):
print("Woof!")
## Create instances with unique attributes
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Lucy", "Labrador")
## Access the instance attributes
print(f"{dog1.name} is a {dog1.breed}.")
print(f"{dog2.name} is a {dog2.breed}.")
## The class attribute is still shared
print(f"Both are of the species: {dog1.species}")
Вот что изменилось:
def __init__(self, name, breed):: Мы определили метод__init__. Он принимаетself,nameиbreedв качестве аргументов.self.name = nameиself.breed = breed: Эти строки создают атрибуты экземпляра (instance attributes). Они уникальны для каждого объектаDog. Ключевое словоselfприкрепляет эти атрибуты к конкретному создаваемому экземпляру.dog1 = Dog("Buddy", "Golden Retriever"): При создании экземпляра мы теперь передаем аргументы дляnameиbreed. Они автоматически передаются методу__init__.
Сохраните файл и запустите его из терминала:
python dog.py
Вывод показывает, что каждый объект собаки имеет свое собственное имя и породу, при этом все еще разделяя атрибут класса species.
Buddy is a Golden Retriever.
Lucy is a Labrador.
Both are of the species: Canis familiaris
Настройка представления объекта с помощью __repr__
Когда вы пытаетесь напрямую напечатать объект, Python показывает представление по умолчанию, которое включает класс объекта и его адрес в памяти, что не очень информативно. Вы можете предоставить более описательное и удобное для разработчика строковое представление, определив специальный метод __repr__.
Давайте добавим метод __repr__ в наш класс Dog.
Откройте dog.py и замените его содержимое следующей финальной версией нашего кода:
## Define a Dog class with __init__ and __repr__ methods
class Dog:
## Class attribute
species = "Canis familiaris"
## The __init__ method (constructor)
def __init__(self, name, breed):
self.name = name
self.breed = breed
## The __repr__ method for a developer-friendly representation
def __repr__(self):
return f"Dog(name='{self.name}', breed='{self.breed}')"
## Method
def bark(self):
print("Woof!")
## Create an instance
my_dog = Dog("Buddy", "Golden Retriever")
## Print the object directly
print(my_dog)
Ключевые дополнения:
def __repr__(self):: Это определяет метод представления.return f"Dog(name='{self.name}', breed='{self.breed}')": Этот метод должен возвращать строку. Хорошей практикой является создание строки, которая выглядит как допустимое выражение Python, которое можно использовать для воссоздания объекта с тем же состоянием.
Сохраните файл и запустите скрипт в последний раз:
python dog.py
Вместо адреса в памяти вывод теперь представляет собой четкую, информативную строку, возвращаемую вашим методом __repr__. Это чрезвычайно полезно для отладки (debugging).
Dog(name='Buddy', breed='Golden Retriever')
Резюме
В этой лабораторной работе вы изучили основы Объектно-Ориентированного Программирования (ООП) на Python. Вы начали с определения простого класса и создания его экземпляра, узнав, как использовать атрибуты класса и методы. Затем вы расширили свой класс, добавив метод __init__ для инициализации каждого объекта уникальными атрибутами экземпляра. Наконец, вы настроили строковое представление ваших объектов, реализовав метод __repr__, что значительно улучшает наглядность и отлаживаемость вашего кода. Эти концепции являются основой для построения более сложных и структурированных приложений на Python.



