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]

 


Зв’язані теми