Властивості — це атрибути класу з контролем доступу.
Використовуються декоратори @property
, @
.
Приклад:
class Person:
def __init__(self, name):
self._name = name # Приватний атрибут
@property
def name(self):
print("Отримано ім’я")
return self._name
@name.setter
def name(self, value):
print("Встановлено ім’я")
if not isinstance(value, str):
raise ValueError("Ім’я має бути рядком")
self._name = value
# Використання
person = Person("Анна")
print(person.name) # Викликається getter
person.name = "Богдан" # Викликається setter
Методи — функції, що належать об'єкту або класу.
self
(посилання на об'єкт).
@staticmethod
) — не потребують self
або cls
.
@classmethod
) — приймають cls
(посилання на клас).
Приклад:
class Calculator:
def __init__(self, value=0):
self.value = value
# Звичайний метод
def add(self, x):
self.value += x
# Статичний метод
@staticmethod
def multiply(a, b):
return a * b
# Класовий метод
@classmethod
def from_string(cls, string):
return cls(int(string))
# Використання
calc = Calculator(5)
calc.add(3) # Звичайний метод
print(calc.value) # 8
print(Calculator.multiply(2, 3)) # Статичний метод: 6
calc2 = Calculator.from_string("10") # Класовий метод
print(calc2.value) # 10
Події реалізуються через патерн "Спостерігач".
Клас містить список обробників подій та методи для їх керування.
Приклад:
class EventEmitter:
def __init__(self):
self._event_handlers = []
def add_handler(self, handler):
self._event_handlers.append(handler)
def remove_handler(self, handler):
self._event_handlers.remove(handler)
def trigger_event(self, *args, **kwargs):
for handler in self._event_handlers:
handler(*args, **kwargs)
# Використання
def on_event(message):
print(f"Подія відбулася: {message}")
emitter = EventEmitter()
emitter.add_handler(on_event)
emitter.trigger_event("Hello!") # Виведе: Подія відбулася: Hello!
Це спеціальні методи, які починаються і закінчуються на __
.
Наприклад: __init__
, __str__
, __repr__
.
Приклад:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Vector({self.x}, {self.y})"
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(2, 3)
v2 = Vector(5, 7)
v3 = v1 + v2 # Викликається __add__
print(v3) # Vector(7, 10)
Класи можуть успадковувати атрибути та методи інших класів.
Приклад:
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Гав!"
class Cat(Animal):
def speak(self):
return "Мяу!"
# Поліморфізм
animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak()) # Гав! Мяу!
Python не має строгих модифікаторів доступу, але використовують угоди:
_protected
— захищений атрибут (доступний, але не рекомендується).
__private
— приватний атрибут (ім'я "змінюється" інтерпретатором).
Приклад:
class BankAccount:
def __init__(self, balance):
self.__balance = balance # Приватний атрибут
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def get_balance(self):
return self.__balance
account = BankAccount(100)
# account.__balance # Помилка: атрибут недоступний
print(account.get_balance()) # 100
@property
.