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

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (Lab) вы узнаете о классах и объектах в Python. Класс представляет собой шаблон для создания объектов. Объект - это экземпляр класса.

Достижения

  • Имена и объекты
  • Области видимости и пространства имен
  • Экземпляры объектов
  • Методы объектов
  • Наследование
  • Приватные переменные

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/constructor("Constructor") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") python/ObjectOrientedProgrammingGroup -.-> python/encapsulation("Encapsulation") subgraph Lab Skills python/function_definition -.-> lab-71{{"Классы и объекты"}} python/classes_objects -.-> lab-71{{"Классы и объекты"}} python/constructor -.-> lab-71{{"Классы и объекты"}} python/inheritance -.-> lab-71{{"Классы и объекты"}} python/encapsulation -.-> lab-71{{"Классы и объекты"}} end

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

Для определения класса в Python используйте ключевое слово class, за которым следует имя класса.

Определение класса должно содержать метод __init__, который является специальным методом в Python, вызываемым при создании объекта из этого класса.

Откройте новый интерпретатор Python.

python3

Вот пример класса, представляющего круг:

class Circle:
    def __init__(self, radius):
        self.radius = radius

Метод __init__ принимает параметр radius и присваивает его атрибуту radius объекта.

Создание экземпляра объекта

Для создания экземпляра объекта из класса необходимо вызвать имя класса, за которым следуют круглые скобки. Он называется "экземпляром", потому что это конкретный случай (вхождение) класса.

circle1 = Circle(5)

В этом примере создается экземпляр объекта circle1 типа Circle с радиусом, равным 5. Экземпляры объектов могут использоваться для хранения данных, специфичных для данного объекта. Например, каждый объект Circle может иметь разный радиус.

Метод __init__ из предыдущего шага будет вызван автоматически при создании объекта, и атрибут radius объекта будет инициализирован значением 5.

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

Важно отметить, что метод __init__ - это обычный метод и может иметь любое имя. Однако рекомендуемая конвенция именования - использовать __init__, чтобы было ясно, что это метод инициализации класса.

Доступ к атрибутам и их изменение

Для доступа к атрибутам объекта используйте точечную нотацию. Например, чтобы получить доступ к радиусу объекта circle1, вы можете использовать следующий код:

print(circle1.radius) ## Output: 5

Вы можете изменить атрибуты объекта, присвоив им новое значение. Например, чтобы изменить радиус объекта circle1, вы можете использовать следующий код:

circle1.radius = 10
print(circle1.radius) ## Output: 10

Добавление методов объекта

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

Вот пример метода area, определенного в классе Circle:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

Метод area вычисляет площадь круга на основе его радиуса. Он делает это, используя атрибут self.radius, который ссылается на радиус объекта, на котором вызывается метод.

Для вызова метода на объекте используйте точечную нотацию, за которой следуют имя метода и круглые скобки. Например, чтобы вызвать метод area на объекте circle1, вы можете использовать следующий код:

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

Это выведет площадь объекта circle1, который является конкретным экземпляром класса Circle.

Методы полезны для инкапсуляции функциональности внутри класса и предоставления способа работы с данными, хранящимися в атрибутах объекта.

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

Экземпляры объектов и методы объектов - это два основных типа объектов в Python. В заключение, экземпляры объектов создаются из класса, а методы объектов определяются внутри класса.

Наследование

Наследование - это способ создания нового класса, который является модифицированной версией существующего класса. Новый класс называется подклассом (subclass), а существующий класс - суперклассом (superclass).

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

Вот пример подкласса Cylinder, который наследует от класса Circle:

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

Класс Cylinder имеет метод __init__, который принимает два параметра: radius и height. Он вызывает метод __init__ класса Circle с помощью функции super(), чтобы инициализировать атрибут radius объекта, а затем устанавливает атрибут height объекта.

Функция super() - это специальная функция в Python, которая ссылается на суперкласс класса. Она используется для вызова методов суперкласса изнутри подкласса.

Функция super() определяется в определении класса и принимает параметр self, который ссылается на создаваемый объект. Она также может принимать дополнительные параметры в зависимости от вызываемого метода. В этом примере она передает параметр radius в метод __init__ класса Circle и инициализирует атрибут radius объекта.

Теперь класс Cylinder имеет все атрибуты и методы класса Circle, а также дополнительный атрибут height. Вы можете получить доступ к атрибутам и методам класса Cylinder с помощью точечной нотации, как и в классе Circle.

Например, вы можете создать объект Cylinder и получить доступ к его атрибутам следующим образом:

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## выводит 5
print(cylinder1.height)  ## выводит 10

Наследование - это полезная особенность объектно-ориентированного программирования, так как оно позволяет повторно использовать код и создавать иерархию классов.

Функция super()

Функция super() полезна, когда вы хотите повторно использовать код из суперкласса в подклассе и расширить его дополнительной функциональностью.

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

Например, рассмотрим следующие классы:

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

Здесь класс C является подклассом класса B, который в свою очередь является подклассом класса A. Если вы вызовете метод method на объекте класса C, он сначала вызовет метод method класса A с использованием функции super(), затем метод method класса B с использованием функции super(), и, наконец, метод method класса C.

obj = C()
obj.method()  ## выводит "A method", "B method", "C method"

Функция super() - это полезная особенность объектно-ориентированного программирования, которая позволяет повторно использовать код и создавать иерархию классов.

Приватные переменные

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

Для определения приватной переменной в классе Circle можно использовать префикс двойного подчеркивания (__), за которым следует имя переменной. Например:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

В этом коде определена приватная переменная __radius в классе Circle.

Приватные переменные предназначены для использования только внутри класса, в котором они определены. Они не могут быть напрямую доступны извне класса. Например, если вы попытаетесь получить доступ к переменной __radius извне класса Circle, возникнет ошибка:

circle1 = Circle(5)
print(circle1.__radius)  ## Это вызовет ошибку AttributeError

Приватные переменные полезны для инкапсуляции данных внутри класса и ограничения возможности внешнего кода модифицировать их. Однако важно отметить, что приватные переменные в Python не являются действительно приватными и все еще могут быть доступны извне класса с использованием "искажения имен" (name mangling).

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

Например, переменную __radius все еще можно получить извне класса Circle с использованием следующего синтаксиса:

print(circle1._Circle__radius)  ## Это выведет 5

Однако это не считается хорошим практикой программирования и следует избегать.

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

Вот пример класса Circle с приватной переменной __radius и публичными методами для доступа и изменения радиуса:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Для доступа к радиусу объекта Circle можно использовать метод get_radius:

circle1 = Circle(5)
print(circle1.get_radius())  ## выводит 5

Для изменения радиуса объекта Circle можно использовать метод set_radius:

circle1.set_radius(10)
print(circle1.get_radius())  ## выводит 10

Итоги

В этом практическом занятии вы узнали о классах и объектах в Python. Вы научились определять класс, создавать объект на основе класса, получать доступ к атрибутам и методам объекта, изменять атрибуты объекта и создавать подкласс, который наследует от суперкласса.

Вот краткое изложение основных концепций, рассмотренных в этом практическом занятии:

  • Класс - это шаблон для создания объектов. Объект - это экземпляр класса.
  • Метод __init__ вызывается при создании объекта на основе класса. Он позволяет установить атрибуты объекта.
  • Вы можете получить доступ к атрибутам объекта с помощью точечной нотации и вызвать методы объекта, используя точечную нотацию, за которой следуют имя метода и круглые скобки.
  • Вы можете изменить атрибуты объекта, присвоив им новые значения.
  • Наследование позволяет создать подкласс, который является модифицированной версией суперкласса. Подкласс может переопределить или расширить методы суперкласса.

Надеюсь, это практическое занятие помогло вам узнать о классах и объектах в Python. Сообщите, если у вас есть какие - то вопросы!