Инкапсуляция

В объектно-ориентированных языках программирования есть спецификаторы, ограничивающие доступ к аттрибутам. Главной задачей является отделение деталей реализации логики объекта от того как с ним надо взаимодействовать.

В языке Python в отличие от многих других языков вместо ключевых слов используется знак нижнего подчёркивания.

public - Данный аттрибут доступен всем:

class Person:
  def __init__(self, name):
    self.name = name    # публичный аттрибут

p = Person("John")
p.name = "Mark"

private - Аттрибут сокрыт от посторонних глаз и доступен только самому объекту:

class Person:
  def __init__(self, name, age):
    self.name = name
    self.set_age(age)

  def get_age(self):
    return self.__age

  def set_age(self, age):
    if age >= 0:
      self.__age = int(age)  # __age - приватный аттрибут
    else:
      self.__age = 0
      print("Возраст не может быть отрицательным!")

p = Person("John", 19)
print(p.get_age()) # 19

p.set_age(20)
print(p.get_age()) # 20

p.__age = 21 # Error
p._Person__age = 21
print(p.get_age()) # 21

Задачи

  1. Описать класс десятичного счётчика. Он должен обладать внутренней переменной, хранящей текущее значение, методами повышения значения (increment) и понижения (decrement), получения текущего значения get_counter. Учесть, что счётчик не может опускаться ниже 0.

  2. Создать класс для часов. Должна быть возможность установить время при создании объекта. Также необходимо реализовать методы, с помощью которых можно добавлять по одной минуте/секунде или по одному часу к текущему времени. Помнить, что значения минут и секунд не могут превышать 59, а часов 23.

  3. Доработать предыдущую задачу, чтобы можно было складывать двое часов друг с другом. Для перегрузки оператора + использовать метод __add__(self, other).

  4. Создать классы для травоядного животного и травы. Животное должно уметь поедать траву, если испытывает голод, в противном случае отказываться от лакомства. Трава должна обладать питательностью, в зависимости от которой животное будет насыщаться.