Определение классов и объектов в Python

PythonPythonBeginner
Практиковаться сейчас

Введение

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

Вы получите практический опыт, создавая и используя экземпляры (instances) определенных вами классов. Лабораторная работа проведет вас через инициализацию объектов с помощью метода __init__ для установки их начального состояния и настройку их строкового представления с помощью метода __repr__ для улучшения отладки и читаемости.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 94%. Он получил 100% положительных отзывов от учащихся.

Определение класса и создание экземпляра

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

В Объектно-Ориентированном Программировании класс (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.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.