В объектно-ориентированном программировании (ООП) центральным понятием является объект. В языке Python всё является объектом, будь то числа, строки или структуры данных. Итак, что же такое объект?
С точки зрения ООП, объект — это единица, которая:
Чтобы проиллюстрировать это, рассмотрим встроенный тип данных list
. Создадим объект списка и выполним несколько операций:
my_list = [1, 2, 3]
print(my_list)
my_list.append(5)
print(my_list)
my_list.reverse()
print(my_list)
Вначале создаётся объект списка с данными [1, 2, 3]
. Затем, используя метод append()
, мы добавляем элемент в конец списка, изменяя его состояние. После этого вызываем метод reverse()
, который изменяет порядок элементов. В результате состояние объекта изменяется снова.
Следующим важным понятием в ООП является класс. Класс определяет свойства и поведение, которые будут характерны для всех его экземпляров.
Классы в программировании можно условно сравнить с классификациями в биологии. Например, в классе "Птицы" объединены различные виды птиц, такие как совы, воробьи и колибри. Каждая птица — это объект класса "Птицы", обладающий определёнными характеристиками, такими как способность летать. Классы помогают разделять объекты по типам, а их поведение определяется методами.
Рассмотрим пример:
hello = "Hello, World!"
hello.append(5) # AttributeError: 'str' object has no attribute 'append'
Здесь возникает ошибка, потому что объект строки не имеет метода append
. Это ещё раз показывает, что каждый класс имеет свои уникальные методы и атрибуты.
Каждый объект в Python принадлежит определённому классу. Определить класс объекта можно с помощью функции type()
:
hello = "Hello, World!"
print(type(hello)) # <class 'str'>
my_list = [1, 2, 3]
print(type(my_list)) # <class 'list'>
Вы также можете проверить принадлежность объекта к классу с помощью функции isinstance()
:
print(isinstance(hello, str)) # True
print(isinstance(my_list, list)) # True
Более того, в Python все объекты, независимо от их типа, являются экземплярами класса object
:
print(isinstance(hello, object)) # True
print(isinstance(my_list, object)) # True
Для создания собственного класса в Python используется ключевое слово class
. Рассмотрим пример создания простого класса Car
:
class Car:
pass
В соответствии с PEP8, имя класса всегда начинается с заглавной буквы. Если имя состоит из нескольких слов, используется стиль написания CamelCase
.
Можно добавить строку документации к классу:
class Car:
"Класс, описывающий автомобиль"
Теперь мы можем создавать экземпляры этого класса:
a = Car()
b = Car()
print(a, b)
Экземпляр класса — это конкретный объект, созданный на основе класса. Чтобы создать экземпляр, нужно вызвать класс как функцию. Экземпляры можно сохранять в переменные:
a = Car()
b = Car()
print(a, b)
print(type(a))
Экземпляры хранятся в памяти как отдельные объекты с уникальными идентификаторами:
print(id(a), id(b)) # Выводит два разных идентификатора
Вы также можете создать коллекцию экземпляров, например, список:
cars = [Car() for _ in range(5)]
print(cars)
Пока что наш класс Car
не содержит никаких данных или поведения. Чтобы добавить данные, мы можем определить атрибуты внутри класса:
class Car:
model = "BMW"
engine = 1.6
Теперь каждый экземпляр класса Car
будет иметь атрибуты model
и engine
:
a = Car()
print(a.model) # Выводит: BMW
print(a.engine) # Выводит: 1.6
Обратите внимание, что на данном этапе все экземпляры будут иметь одинаковые значения атрибутов. Тем не менее, их можно изменить:
b = Car()
b.model = "VAZ"
b.color = "white"
print(b.model, b.color) # Вывод: VAZ white
Теперь экземпляр b
имеет изменённое значение атрибута model
, а также новый атрибут color
, который был добавлен динамически.
Понятие | Описание | Пример |
---|---|---|
Класс | Шаблон или структура, описывающая свойства и поведение объектов. | class Car: |
Объект | Конкретный экземпляр класса, созданный на его основе. | my_car = Car() |
Атрибут | Переменные, которые описывают свойства объекта. | Car.model = "BMW" |
Метод | Функции, которые определяют поведение объектов. | Car.start_engine() |
Наследование | Способ, с помощью которого один класс может наследовать свойства и методы другого класса. | class ElectricCar(Car): |
Инкапсуляция | Процесс скрытия деталей реализации объекта, предоставляя только необходимые методы для взаимодействия. | self.__private_method() |
На данном этапе мы рассмотрели базовые понятия классов и объектов, их атрибуты и методы. В дальнейшем, мы углубимся в создание сложных классов с методами и атрибутами, что позволит создавать более гибкие и мощные программы.