Python. Классы в Python. Общие понятия. Объекты классов. Объекты экземпляров




Классы в Python. Общие понятия. Ключевое слово class. Объекты классов. Объекты экземпляров


Содержание


Поиск на других ресурсах:

1. Особенности использования классов в языке Python. Объекты классов и объекты экземпляров

В языке программирования Python классы характеризуются следующими особенностями:

  • в отдельности классы представляют собой определенные пространства имен;
  • классы поддерживают создание набора объектов;
  • пространства имен классов могут быть унаследованы;
  • в классах можно реализовывать перегрузку функций (методов);
  • в классах можно реализовывать перегрузку операторов.

Как известно, в языке Python любой элемент (число, строка, список и т.д) представлен объектом. Это касается и объектно-ориентированной модели Python, в которой различают два типа объектов:

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

 

2. Создание объекта класса. Общая форма

Объект класса создается с помощью инструкции, которая содержит ключевое слово class. В простейшем случае общая форма создания объекта класса имеет вид:

class ClassName:
    # Элементы (атрибуты), реализованные в классе
    # ...

здесь

  • ClassName – имя создаваемого класса. Это есть имя объекта класса. В этом классе можно реализовывать разные элементы класса, например внутренние данные, функции (методы), операторы и т.д.

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

 

3. Создание объекта экземпляра. Общая форма

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

Общая форма создания объекта экземпляра следующая:

Obj = ClassName()

здесь

  • Obj – имя объекта экземпляра, который создается объектом класса с именем ClassName. Созданный объект экземпляра Obj имеет свое собственное пространство имен;
  • ClassName – имя объекта класса, который создается с помощью инструкции class.

 

4. Особенности объектов классов

В языке Python для объектов классов можно выделить следующие особенности:

  • объект класса создается с помощью инструкции class, которая определена как выполняемая инструкция (ее можно вызывать из программного кода). Вызов инструкции class создает новый объект класса;
  • внутри инструкции class можно создавать атрибуты объекта класса. Это осуществляется с помощью операции присваивания =. Доступ к атрибутам класса осуществляется по их составным (полным) именам, например Obj.NameAtr (атрибут с именем NameAtr в объекте класса с именем Obj);
  • атрибуты класса описывают состояние объекта. Под состоянием объекта имеется в виду текущее значение данных внутри объекта;
  • атрибуты класса описывают поведение объекта. Под понятием «поведение объекта» понимается наличие методов, обрабатывающих экземпляры. Методы в классах определяются с помощью инструкции def.

 

5. Особенности объектов экземпляров

Объект экземпляра есть результатом вызова объекта класса. Для объектов экземпляров можно выделить следующие характерные особенности:

  • объект экземпляра создается на основании вызова объекта класса как функции, которая содержит круглые скобки ( ). Из одного объекта класса может быть создано любое количество объектов экземпляра;
  • объект экземпляра есть конкретным элементом данных в программе;
  • при создании каждый объект экземпляра наследует атрибуты класса, на основе которого он создается;
  • объект экземпляра имеет свое собственное пространство имен;
  • присваивание значений атрибутам происходит через первый аргумент, которым может быть, например, ссылка с именем self (смотрите примеры ниже). После присваивания создается соответствующий атрибут в каждом отдельном объекте экземпляра. В этом случае методы класса получают первым аргументом ссылку self (в соответствии с договоренностью), которая соответствует объекту экземпляра. С помощью этой ссылки (self) можно создавать или изменять данные экземпляра объекта. Данные экземпляра класса с помощью self создать (изменить) нельзя.

 

6. Что такое атрибут класса? Пример класса Circle

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

Например. Пусть задан класс с именем Circle, реализующий окружность на координатной плоскости.

# Классы. Атрибуты класса. Пример.
# Объявить класс Circle, который реализует окружность на координатной плоскости
class Circle:
    # Метод, устанавливающий значение центра окружности (x,y) и радиуса
    def Set(cr, x, y, radius):
        cr.x = x
        cr.y = y
        cr.radius = radius
        return

    # Получить данные об окружности в виде списка
    def Get(cr):
        return [cr.x, cr.y, cr.radius] # Вернуть как список

    def Print(cr):
        print('x = ', cr.x, ', y = ', cr.y, ',   radius = ', cr.radius)
        return

    # Вычислить площадь окружности
    def Area(cr):
        return 3.1415*cr.radius*cr.radius

# Объявить экземпляр объекта класса
circle1 = Circle()

# Установить значение координат
circle1.Set(2, 3, 5)

# Вывести данные об окружности circle1
circle1.Print()

# Вычислить площадь круга
area = circle1.Area()
print('circle1.Area() = ', area)

В вышеприведенном классе Circle реализованы следующие атрибуты:

  • метод Set(), устанавливающий значение атрибутов x, y, radius;
  • метод Get(), возвращающий данные об окружности в виде списка;
  • метод Print() – выводит информацию об окружности;
  • метод Area() – выводит площадь окружности радиуса radius;
  • внутренние поля данных x, y – координаты центра окружности;
  • поле данных radius – радиус окружности.

В методах первым аргументом используется параметр с именем cr, который означает текущий экземпляр. Через это имя cr осуществляется доступ к данным: cr.x, cr.y, cr.radius. Имя cr может быть заменено на другое имя, например self.

 

7. Пример объявления и использования простого класса, сохраняющего некоторое значение

В примере объявляется класс с именем Value. В классе создается ячейка с данными, которая содержит некоторое значение. Имя данных в классе – value. Чтобы доступиться к данным используется параметр self, который представляет собой текущий экземпляр класса. Допускается использование другого имени вместо имени self (например, self2).

# Классы. Объявление класса. Использование класса
# Объявить класс Value, который содержит некоторое значение
class Value:
    # Объявление метода в классе Value
    def SetValue(self, val):
        self.value = val # self.value - сохраняемое значение

    # Метод, возвращающий значение value
    def GetValue(self):
        return self.value

    def Print(self):
        print("value = ", self.value)

# Случай 1. Вызов методов через объект экземпляра
obj1 = Value() # Объявить объект класса Value
obj1.SetValue(25) # Установить новое значение в объекте класса
obj1.Print() # value = 25

# Случай 2. Вызов метода SetValue() через объект класса
obj2 = Value() # Объявить объект класса Value
Value.SetValue(obj2, 37)
Value.Print(obj2) # value = 37

Результат выполнения программы

value = 25
value = 37

На рисунке 1 изображены объекты, которые создаются в вышеприведенном примере.

Python. Объект класса и объект экземпляра

Рисунок 1. Структура программы: объекты экземпляра и объект класса

 

8. Пример реализации класса, который сохраняет набор данных. Класс SquareEquation — решение квадратного уравнения

В примере создается экземпляр класса, который предназначен для решения квадратного уравнения. В классе с помощью имени экземпляра self создаются три члена данных с именами a, b, c.

Также в методах класса используются дополнительные внутренние переменные с именами d, x1, x2. Это только временные локальные переменные. Они не являются данными экземпляра класса и не влияют на состояние конкретного экземпляра объекта. Внутреннее состояние любого экземпляра объекта определяется данными a, b, c.

# Классы. Пример.

import math

# Объявить класс SquareEquation, решающий квадратное уравнение
class SquareEquation:
    # Метод инициализации данных класса
    def __init__(self, a, b, c):
        # создается три члена данных класса
        self.a = a
        self.b = b
        self.c = c
        return

    # Метод вычисления корней уравнения
    def Calc(self):
        # d - дискриминант, дополнительная локальная переменная
        d = self.b*self.b - 4*self.a*self.c

        if (d<0):
            print("The equation has no roots")
            return []
        else:
            # x1, x2 - локальные переменные - это не есть члены данных класса
            x1 = (-self.b - math.sqrt(d))/(2.0*self.a)
            x2 = (-self.b + math.sqrt(d))/(2.0*self.a)
            return [x1, x2]

# Использование класса SquareEquation
equation1 = SquareEquation(1, 1, -2) # конкретный экземпляр объекта
result = equation1.Calc()
print('result = ', result)

Результат работы программы

result = [-2.0, 1.0]

 


Связанные темы