Python · Синтаксис · Початковий рівень
Основи ООП
Практичні завдання з основ ООП в Python: створення класів та об'єктів, атрибути, методи, __init__, зміна стану об'єкта та просте моделювання сутностей.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
__init__ і self
#Поширені патерни класів
#Швидкий довідник: основи ООП
#Вправи:
Клас User з ім’ям.
#Створіть клас User з атрибутом name . Створіть об’єкт цього класу та виведіть його ім’я.
class User:
pass
u = User("Alex")
print(u.name)
Рішення
class User:
def __init__(self, name):
self.name = name
u = User("Alex")
print(u.name)
# або можна створити метод, який повертає ім’я
class User:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
Клас Car: бренд і рік.
#Створіть клас Car з атрибутами brand і year . Створіть об’єкт і виведіть рядок: "Car: Toyota, 2020"
class Car:
pass
Рішення
class Car:
def __init__(self, brand, year):
self.brand = brand
self.year = year
c = Car("Toyota", 2020)
print(f"Car: {c.brand}, {c.year}")
# або
class Car:
def __init__(self, brand, year):
self.brand = brand
self.year = year
def __str__(self):
return f"Car: {self.brand}, {self.year}"
c = Car("Toyota", 2020)
print(c)
Лічильник з increment.
#Створіть клас Counter з атрибутом value . Додайте метод increment , який збільшує значення на 1.
class Counter:
pass
c = Counter(0)
c.increment()
print(c.value)
Рішення
class Counter:
def __init__(self, value):
self.value = value
def increment(self):
self.value += 1
c = Counter(0)
c.increment()
print(c.value)
# або так можна: increment може повертати нове значення
class Counter:
def __init__(self):
self.value = 0
def increment(self):
self.value += 1
return self.value
Площа прямокутника.
#Створіть клас Rectangle з атрибутами width і height . Додайте метод area , який повертає площу.
class Rectangle:
pass
r = Rectangle(3, 4)
print(r.area())
Рішення
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
r = Rectangle(3, 4)
print(r.area())
# або так можна: площу спочатку зберегти у змінну
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
result = self.width * self.height
return result
Привітання методом класу.
#Створіть клас Greeting з методом say_hello , який повертає рядок "Hello!" .
class Greeting:
pass
g = Greeting()
print(g.say_hello())
Рішення
class Greeting:
def say_hello(self):
return "Hello!"
g = Greeting()
print(g.say_hello())
Перевірка повноліття.
#Створіть клас Person з атрибутами name і age . Додайте метод is_adult , який повертає True , якщо вік 18 і більше.
class Person:
pass
p = Person("John", 20)
print(p.is_adult())
Рішення
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def is_adult(self):
return self.age >= 18
p = Person("John", 20)
print(p.is_adult())
Поповнення банківського рахунку.
#Створіть клас BankAccount з атрибутом balance . Додайте метод deposit , який збільшує баланс.
class BankAccount:
pass
acc = BankAccount(100)
acc.deposit(50)
print(acc.balance)
Рішення
class BankAccount:
def __init__(self, balance):
self.balance = balance
def deposit(self, amount):
self.balance += amount
acc = BankAccount(100)
acc.deposit(50)
print(acc.balance)
# або так можна: явно не дозволяти поповнювати рахунок від’ємною сумою
class BankAccount:
def __init__(self, balance):
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
Конвертація Celsius у Fahrenheit.
#Створіть клас Temperature з атрибутом celsius . Додайте метод to_fahrenheit , який повертає температуру у градусах Фаренгейта. Формула така: celsius * 9 / 5 + 32.
class Temperature:
pass
t = Temperature(0)
print(t.to_fahrenheit())
Рішення
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
def to_fahrenheit(self):
return self.celsius * 9 / 5 + 32
t = Temperature(0)
print(t.to_fahrenheit())
Довжина повідомлення методом.
#Створіть клас Message з атрибутом text . Додайте метод length , який повертає довжину повідомлення.
class Message:
pass
m = Message("Hello world")
print(m.length())
Рішення
class Message:
def __init__(self, text):
self.text = text
def length(self):
return len(self.text)
m = Message("Hello world")
print(m.length())
Таймер з додаванням секунд.
#Створіть клас Timer з атрибутом seconds . Додайте метод add_time , який збільшує час на вказану кількість секунд.
class Timer:
pass
t = Timer(10)
t.add_time(5)
print(t.seconds)
Рішення
class Timer:
def __init__(self, seconds):
self.seconds = seconds
def add_time(self, extra):
self.seconds += extra
t = Timer(10)
t.add_time(5)
print(t.seconds)
Клас Formatter для рядків.
#Напишіть клас Formatter з атрибутом string у об’єкта. Під час створення екземпляра цього класу (об’єкта) туди передається рядок, який зберігається в цьому атрибуті string у об’єкта. У цього класу має бути кілька методів, які повинні повертати змінений варіант цього рядка відповідно до їх призначення: - метод trim повертає рядок, обрізаний до вказаної довжини в кінці з "[...]" (довжина цих доданих символів має бути врахована). - метод truncate повертає обрізаний рядок до вказаної довжини, але не "розриває слова", а обрізає його по пробілу, але не довше за вказану довжину. Цього достатньо. УВАГА: - початковий рядок у self.string завжди має залишатися початковим. - не створювати жодних інших атрибутів для результатів, лише повертати нові значення. Локальні змінні, звісно, можна. - можна створювати атрибути для службових даних, наприклад для рядка "[...]" Пам’ятайте, що методи — це просто особливі функції, куди в перший параметр self автоматично передається посилання на сам об’єкт, але усі інші правила у вигляді звичайних локальних змінних та іншого — як у звичайних функцій. Тобто не обов’язково всередині методу все навішувати на self.змінна, можна просто створювати локальні змінні як у звичайних функціях.
class Formatter():
def __init__(self, string):
pass
def trim(self, length):
pass
def truncate(self, length):
pass
x = Formatter("Эта строка для примера просто используется тут и не имеет другого смысла.")
print(x.trim(15)) # Эта строка[...]
print(x.truncate(15)) # Эта строка для
print(x.string) # Изначальная строка
y = Formatter("Ура у меня получилось!.")
print(y.trim(8)) # Ура[...]
print(y.truncate(3)) # Ура
print(y.string) # Изначальная строка
Рішення
class Formatter():
def __init__(self, string):
self.string = string
self.end = "[...]"
def trim(self, length):
return self.string[: length - len(self.end)] + self.end
def truncate(self, length):
if self.string[length] == " ":
return self.string[:length]
return self.string[:length].rsplit(" ", 1)[0]
x = Formatter("Эта строка для примера просто используется тут и не имеет другого смысла.")
print(x.trim(15)) # Эта строка[...]
print(x.truncate(15)) # Эта строка для
print(x.string) # Изначальная строка
y = Formatter("Ура у меня получилось!.")
print(y.trim(8)) # Ура[...]
print(y.truncate(3)) # Ура
print(y.string) # Изначальная строка