Перейти к содержанию

Конструктор и методы класса

В ООП переменные можно использовать как на уровне класса, так и на уровне экземпляра класса. Если значение переменной одинаковое для всех экземпляров класса, то такую переменную разумнее определить как переменную класса. Например:

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
  1. Стивен Кинг писал 'Бегущий человек' под псевдонимом. Поменяйте автора этой книги на 'Ричард Бахман (Стивен Кинг)'.

  2. Долой сокращения! Пускай атрибут класса author по умолчанию будет не C. Кинг, а Стивен Кинг.

Если вы сделали все верно, то it.author и shining.author будут иметь значение Стивен Кинг, а running_man.author - 'Ричард Бахман (Стивен Кинг)'.

Загрузка тренажера...

Задание на методы: Листаем электронную книгу

Создайте класс Book, экземпляры которого можно создать такой командой:

Book(pages=100)

Экземпляр должен обладать переменными pages (количество страниц) и current_page (текущая страница). Кроме того, нужно реализовать три метода:

  • Book.set_page(n) - устанавливает текущую страницу на n
  • Book.next_page() - перелистывает страницу вперед
  • Book.prev_page() - перелистывает страницу назад

Если страницы не существует (n меньше 1 или больше Book.pages), метод должен вызвать ошибку ValueError. Чтобы избежать шаблонного кода (многократного повторения), пропишите проверку в set_page или отдельном методе, а затем вызывайте этот метод во всех остальных.

Загрузка тренажера...

Задание на методы 2

Автоматический турникет на предприятии считывает имя сотрудника с его пропуска. Мы написали класс EntryMonitor, который содержит атрибут log - словарь в котором ключами выступают имена сотрудников, а значениями - кортежи из двух целых чисел. Первое число - сколько раз сотрудник входил в здание, а второе - сколько выходил.

Создайте следующие методы в этом классе:

  • come(name) - срабатывает при входе в здание, добавляя 1 к первому числу в кортеже по ключу name. Если сотрудник заходит впервые, создает новую запись в log
  • out(name) - срабатывает при выходе из здания, добавляя 1 ко второму числу в кортеже по ключу name
  • in_building(name) - возвращает True, если сотрудник в здании
  • all_in_building - возвращает список сотрудников в здании
  • total - возвращает целое число - количество проходов через турникет (в обе стороны)
Загрузка тренажера...

Проверка

Загрузка тренажера...