Атрибути класів за помовчанням доступні або публічні (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)
В цьому відео поговоримо про інкапсуляцію (важлива концепція ООП).