Конструктор и методы класса
В ООП переменные можно использовать как на уровне класса, так и на уровне экземпляра класса. Если значение переменной одинаковое для всех экземпляров класса, то такую переменную разумнее определить как переменную класса. Например:
class Cat:
sound = 'Meow'
def __init__(self, name='Noname', color='colorful'):
self.name = name
self.color = color
Сейчас у каждого экземпляра класса есть две переменные - name, color. И к ним можно обратиться.
>>> cat1 = Cat(name='Мурзик')
>>> print(cat1.name, cat1.color)
Murzik colorful
Проверить переменные экземпляра:
>>> vars(cat1)
{'name': 'Murzik', 'color': 'colorful'}
Но при этом, если посмотреть на все доступные методы и переменные для cat1 увидим еще и переменную sound
>>>dir(cat1)
['__class__', ... , 'sound', 'color', 'name']
Значит, мы можем обратиться и к cat1.sound
>>> cat1.sound
Meow
Но это все еще переменная класса, а не экземпляра. Чтобы изменить значение этой переменной, надо обратиться к ней через имя класса:
>>> Cat.sound = 'Мяу'
>>> Cat.sound
Мяу
Если же Вам попадется японский котик, который мяукает иначе, можно поменять его переменную sound:
>>> neko.sound = 'Nya'
>>> vars(neko)
{'name': 'Murzik', 'color': 'colorful', 'sound': 'Nya'}
В этом случае конкретно у этого котика будет уже собственная переменная sound, которая никак не связана с переменной класса.
>>> Cat.sound
Мяу
>>> neko.sound
Nya
Задание на переменные: Король ужасов
В онлайн-каталоге книг решили завести отдельный класс для книг Стивена Кинга. Для каждой книги должны указываться следующие поля:
author- авторtitle- заголовок-
year- год издания -
Создайте класс
KingBook. Подумайте, какие аргументы должны принадлежать классу, а какие - его экземплярам. Затем создайте три экземпляра этого класса:
| Переменная | author | title | year |
|---|---|---|---|
| it | 'С. Кинг' | 'Оно' | 1986 |
| running_man | 'С. Кинг' | 'Бегущий человек' | 1982 |
| shining | 'С. Кинг' | 'Сияние' | 1977 |
-
Стивен Кинг писал 'Бегущий человек' под псевдонимом. Поменяйте автора этой книги на 'Ричард Бахман (Стивен Кинг)'.
-
Долой сокращения! Пускай атрибут класса author по умолчанию будет не
C. Кинг, аСтивен Кинг.
Если вы сделали все верно, то it.author и shining.author будут иметь значение Стивен Кинг, а running_man.author - 'Ричард Бахман (Стивен Кинг)'.
Задание на методы: Листаем электронную книгу
Создайте класс Book, экземпляры которого можно создать такой командой:
Book(pages=100)
Экземпляр должен обладать переменными pages (количество страниц) и current_page (текущая страница). Кроме того, нужно реализовать три метода:
Book.set_page(n)- устанавливает текущую страницу наnBook.next_page()- перелистывает страницу впередBook.prev_page()- перелистывает страницу назад
Если страницы не существует (n меньше 1 или больше Book.pages), метод должен вызвать ошибку ValueError. Чтобы избежать шаблонного кода (многократного повторения), пропишите проверку в set_page или отдельном методе, а затем вызывайте этот метод во всех остальных.
Задание на методы 2
Автоматический турникет на предприятии считывает имя сотрудника с его пропуска. Мы написали класс EntryMonitor, который содержит атрибут log - словарь в котором ключами выступают имена сотрудников, а значениями - кортежи из двух целых чисел. Первое число - сколько раз сотрудник входил в здание, а второе - сколько выходил.
Создайте следующие методы в этом классе:
come(name)- срабатывает при входе в здание, добавляя 1 к первому числу в кортеже по ключуname. Если сотрудник заходит впервые, создает новую запись вlogout(name)- срабатывает при выходе из здания, добавляя 1 ко второму числу в кортеже по ключуnamein_building(name)- возвращаетTrue, если сотрудник в зданииall_in_building- возвращает список сотрудников в зданииtotal- возвращает целое число - количество проходов через турникет (в обе стороны)