Зберегти прогрес
МОДУЛЬ 8. МОДУЛІ, ВИНЯТКИ, ФАЙЛИ Й КЛАСИ

Урок 5. Класи та об'єкти

⌨ Python⏱ ~19 хв✎ 8 завдань з автоперевіркою✓ безкоштовно

Креслення й об'єкти

Ракета має масу, паливо, тягу — і вміє дещо робити: рахувати повну масу, запускатися. Досі ми зберігали ракету словником, а дії писали окремими функціями. Клас об'єднує дані й дії в одне ціле.

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

Клас — це креслення, об'єкт — конкретна річ, зроблена за кресленням.

●●●код Python
class Rocket:
    def __init__(self, name, mass, fuel):
        self.name = name        # властивості (атрибути) об'єкта
        self.mass = mass
        self.fuel = fuel

    def total_mass(self):       # метод — функція всередині класу
        return self.mass + self.fuel


sich = Rocket("Січ", 2000, 8000)     # створюємо об'єкт
print(sich.name)                     # Січ
print(sich.total_mass())             # 10000
●
__init__ викликається, коли створюють об'єкт, і заповнює його властивості;
●
self — «цей самий об'єкт»: через нього метод бачить свої дані (self.mass);
●
назви класів пишуть з великої літери без _: Rocket, FuelTank.

Метод може змінювати об'єкт

●●●код Python
    def burn(self, amount):
        self.fuel -= amount

Після sich.burn(100) у sich.fuel стане на 100 менше — а в інших ракет нічого не зміниться.

Список об'єктів

●●●код Python
fleet = [Rocket("Січ", 2000, 8000), Rocket("Вега", 1000, 3000)]
for r in fleet:
    print(r.name, r.total_mass())
!ВАЖЛИВО
Класи — основа більшості програм: кожна кнопка, персонаж гри чи вікно — це об'єкт якогось класу.

Часті помилки з класами

Забутий self. Python сам передає об'єкт у метод першим аргументом, тому self потрібен, навіть якщо інших параметрів немає:

●●●код Python
class Rocket:
    def info():                  # забули self
        print("Ракета")

Rocket().info()
⚠ ПОВІДОМЛЕННЯ PYTHON
TypeError: Rocket.info() takes 0 positional arguments but 1 was given

Python каже: «метод не чекає жодного аргументу, а отримав один» — цей один і є об'єкт.

Властивість без self. Усередині методу пиши self.fuel, а не просто fuel — інакше буде NameError.

print(об'єкт) виводить щось на кшталт <__main__.Rocket object at 0x7f3a...>. Це не помилка, а «адреса» об'єкта в пам'яті. Щоб побачити дані, виводь властивості: print(sich.name, sich.fuel).

Гарний друк: __str__

Щоб print(об'єкт) показував не адресу, а зрозумілий текст, додай у клас метод __str__ — він має повертати рядок:

●●●код Python
class Rocket:
    def __init__(self, name, mass):
        self.name = name
        self.mass = mass

    def __str__(self):
        return f"Ракета {self.name}, {self.mass} кг"


print(Rocket("Січ", 10000))     # Ракета Січ, 10000 кг

print і str() самі викликають __str__ — писати .__str__() не треба.

Перевір себе: 8 задач з автоперевіркою
Підказки після помилок, розбір кожної задачі, бали й звання. Безкоштовно, можна без реєстрації.
▶ Розв'язувати задачі