Класи та об'єкти

Клас - це шаблон або схема для створення об'єктів, яка визначає атрибути і методи, характерні для всіх об'єктів цього типу. Класи дозволяють організувати дані та функції, які працюють з цими даними, в єдине ціле.

Об'єкт - екземпляр класу. Кожен об'єкт має стан (визначається атрибутами) і поведінку (визначається методами).

Інкапсуляція - полягає в прихованні внутрішньої реалізації класу та наданні інтерфейсу для взаємодії з об'єктами цього класу. Це допомагає захистити дані та керувати доступом до них.

Наслідування -дозволяє одному класу (дочірньому) успадкувати атрибути і методи іншого класу (батьківського). Це сприяє повторному використанню коду і спрощенню його підтримки.

Поліморфізм -дозволяє використовувати єдиний інтерфейс для роботи з об'єктами різних класів. Це досягається за рахунок перевизначення методів у дочірніх класах, які успадковуються від батьківських.

Абстракція - полягає у виділенні загальних характеристик об'єктів і створенні класів, які представляють ці загальні характеристики. Це допомагає спростити складні системи і поліпшити їх зрозумілість.

class MyClass:
	# Методи об'єкта
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>

	# Методи класу
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>

	# Статичний метод
    @staticmethod
    def static_method():
        return "Цей метод не залежить від екземпляра або класу"

my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()

Змінні класу

class MyClass:
    attribute = "Я атрибут класу"

    @classmethod
    def class_method(cls):
        print(MyClass.attribute)  # Я атрибут класу
     
    def set_name(self, name):
        self.name = name

    def print_name(self):
        print(self.name)   

my_object = MyClass()

print(MyClass.attribute)  # Я атрибут класу
my_object.set_name("Поле об'єкта за ім'ям name")
my_object.print_name()  # "Поле об'єкта за ім'ям name"

Конструктор

class Cat:
    def __init__(self, name, age):
    	if age < 0: raise ValueError("Вік не може бути від'ємним")
        self.name = name
        self.age = age


# Створення об'єкта Cat з ім'ям і віком
barsik = Cat("Barsik", 5)

print(f"Ім'я кота: {barsik.name}, вік: {barsik.age}")  # Вивід: Ім'я кота: Barsik, вік: 5

Створення класу за допомогою type()

MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})

# Створюємо екземпляр класу
instance = MyClass(10)
print(instance.attribute)  # Output: 42
instance.display_value()  # Output: 10

Рівні доступу

У Python існують різні рівні доступу до атрибутів і методів класів, які допомагають контролювати видимість і захищеність даних. Основні механізми управління доступом включають використання одного або двох підкреслень (_ і __) перед іменем атрибута або методу.

Одне підкреслення (protected) _ використовується для атрибутів і методів, які не повинні використовуватися поза класом або модулем. Це не заборонено, але це угода, яку слід дотримуватися для кращої читабельності та підтримки коду.

Два підкреслення (private) __ використовуються для атрибутів і методів, які повинні бути дійсно приватними і захищеними від випадкового або навмисного доступу ззовні. Механізм name mangling робить їх менш доступними, але все ще доступними через спеціальні імена.

2015-2026 © SumyNikNet