Креслення й об'єкти
Ракета має масу, паливо, тягу — і вміє дещо робити: рахувати повну масу, запускатися. Досі ми зберігали ракету словником, а дії писали окремими функціями. Клас об'єднує дані й дії в одне ціле.
Клас і об'єкти
Клас — це креслення, об'єкт — конкретна річ, зроблена за кресленням.
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.Метод може змінювати об'єкт
def burn(self, amount):
self.fuel -= amountПісля sich.burn(100) у sich.fuel стане на 100 менше — а в інших ракет нічого не зміниться.
Список об'єктів
fleet = [Rocket("Січ", 2000, 8000), Rocket("Вега", 1000, 3000)] for r in fleet: print(r.name, r.total_mass())
Часті помилки з класами
Забутий self. Python сам передає об'єкт у метод першим аргументом, тому self потрібен, навіть якщо інших параметрів немає:
class Rocket: def info(): # забули self print("Ракета") Rocket().info()
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__ — він має повертати рядок:
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__() не треба.