Урок 24. Інкапсуляція

Атрибути класів за помовчанням доступні або публічні (public), що надає можливість їх змінювати. Приклад з відео:

#Атрибути класу доступні за замовчуванням, 
#що означає, що ви можете їх змінити.
class Person:
    def __init__(self, name, surname, age):
        self.name = name
        self.surname = surname
        self.age = age
        
    def displayFunc(self):
        print(f"Name: {self.name} Surname:{self.surname} Age:{self.age}")
        
person1 = Person("John", "Smith", 35)
person1.displayFunc()
person1.age = -200
person1.surname = "InvalidSurname"
person1.name = "InvalidName"
person1.displayFunc()
print(person1.surname)

Інкапсуляція у Python — це принцип об’єктно-орієнтованого програмування, що полягає в приховуванні даних об’єкта та наданні доступу до них лише через визначені методи. Це дозволяє контролювати, як дані використовуються, забезпечуючи безпеку і запобігаючи випадковим змінам. У Python для цього використовують односторонній доступ до атрибутів, позначаючи їх як приватні, за допомогою одного або двох підкреслень.

Варіанти модифікаторів доступу:

  • self.name = name – public, доступні звідусіль
  • self._name = name – protected, доступні в межах класу та підкласів
  • self.__name = name – private, доступні в межах класу

Для того щоб зробити змінну приватною треба додати два підкреслення на початку назви змінної. Приклад з відео:

#Ми можемо захистити змінні в класі, 
#позначивши їх приватними.
#Щоб визначити приватну змінну, 
#додайте два підкреслення як префікс
#на початку назви змінної.
#self.__age
class Person:
    def __init__(self, name, surname, age):
        self.__name = name
        self.__surname = surname
        self.__age = age
        
    def displayFunc(self):
        print(f"Name:{self.__name} Surname:{self.__surname} Age:{self.__age}")
        
person1 = Person("John", "Smith", 35)
person1.displayFunc()
#print(person1.__age)
#print(person1.__surname)
#print(person1.__name)

Приклад з відео із застосуванням методу displayFunc() для виведення атрибутів об’єкта класу Person і спробою внесення змін у приватні атрибути:

class Person:
    def __init__(self, name, surname, age):
        self.__name = name
        self.__surname = surname
        self.__age = age
        
    def displayFunc(self):
        print(f"Name:{self.__name} Surname:{self.__surname} Age:{self.__age}")
        
person1 = Person("John", "Smith", 35)
person1.displayFunc()
person1.__name = "James"
person1.__surname = "Johns"
person1.__age = 25
print("--------------")
person1.displayFunc()
print(person1.__age)
print(person1.__surname)
print(person1.__name)
person2 = Person("Jenny", "Jackson", 30)
person2.displayFunc()
print(person2.__age)

Геттери та сеттери

Для внесення змін у приватні атрибути можна використовувати спеціальні методи: setter method (сеттери) – для внесення змін у визначені атрибути класу, getter method (геттери) – для отримання поточних даних з атрибутів класу. Прикладі з відео:

class Person:
    def __init__(self, surname, age):
        self.__surname = surname
        self.__age = age
        
    #setter method
    def setAge(self, age):
        if 1<age<120:
            self.__age=age
            
        else:
            print("Invalid age input.")
    #getter method            
    def getAge(self):
        return self.__age

person1 = Person("Smith", 35)
print(person1.getAge())
person1.setAge(33)
print(person1.getAge())
person1.setAge(0)
print(person1.getAge())
print(person1.__surname)

Замість методів геттерів та сеттерів можна використовувати так звані властивості геттерів та сеттерів. Особливість синтаксису полягає у використанні символу @ для позначення відповідних властивостей. Приклад з відео:

#Щоб створити властивість геттера, 
#використовуйте анотацію @property.
#Щоб створити властивість сеттера, 
#використовуйте анотацію @name.setter.
class Person:
    def __init__(self, surname, age):
        self.__surname = surname
        self.__age = age
        
    @property
    def age(self):
        return self.__age
    
    @age.setter
    def age(self, age):
        if 1<age<120:
            self.__age=age    
        else:
            print("Invalid age input.")
            
person1 = Person("Smith", 35)
print(person1.age)
person1.age = 33
print(person1.age)
person1.age = 150
print(person1.age)
Урок 24. Інкапсуляція

В цьому відео поговоримо про інкапсуляцію (важлива концепція ООП).

Приклади на Github

Leave a Reply

Your email address will not be published. Required fields are marked *