# Задание 1. Определить класс Rectangle, в котором имеется статический метод, вычисляющий площадь прямоугольника.
# Этот метод принимает два параметра (длину и ширину), вызывается в конструкторе для вычисления площади конкртеного
# прямоугольника и результат присваивается локальному свойству создаваемого экземпляра класса

class Rectangle:
    """Класс для определения площади прямоугодника"""

    def __init__(self):
        self.area = Rectangle.getArea(length=0, width=0)

    @staticmethod
    def getArea(length, width):
        s = length * width
        return s


rect1_s = Rectangle.getArea(3, 5)
print(rect1_s)
rect2 = Rectangle()
print(rect2.getArea(10, 10))


# Задание 2. Создайте класс Dog, в каждом его экземпляре создавайте несколько локальных свойств (напримеер, имя,
# возраст, порода) и сделайте так, чтобы можно было создаавть не более пяти ээкземпляров этого класса

class Dog:
    """Класс, хранящий информацию о параметрах собак"""
    __instance = None  # перемеменная, сохраняющая последний созданный экземпляр класса
    __count = 0  # счетчик для отслеживания количества созданных классов

    def __new__(cls, *args, **kwargs):  # функция, контролирующая и создающая экз. класса, перед каждым init
        if cls.__count < 5:   # условие для проверки уже созданного количества экземпляров класса (пока счетчик < 5)
            cls.__count += 1  # наращиваем счетчик перед каждым созданием нового экземпляра класса
            cls.__instance = super(Dog, cls).__new__(cls)  # записываем в переменную последний созданный экземпляр
            return cls.__instance  # возвращаем созданный на каждом шаге экземпляр класса
        else:
            print('5 экземпляров классов уже создано')  # когда счетчик становится равным 5, идем сюда и печатаем
            return cls.__instance  # здесь всегда возвращается 5 экземпляр коасса, так как он был записан в эту
            # переменную на последнем шаге в if

    def __init__(self, name='Undefined', age=0, breed='Undefined'):  # стандартный конструктор для каждого экземпляра
        # класса. Он либо сохраняет свойства для нового экземпляра, либо обновляет свойства последнего пятого
        self.name = name
        self.age = age
        self.breed = breed

#  попытаемся создать 7 экземпляров класса Dog
dog1 = Dog('To', 5, 't')
dog2 = Dog('Tot', 6, 'te')
dog3 = Dog('Toto', 7, 'ter')
dog4 = Dog('Totos', 8, 'teri')
dog5 = Dog('Totosh', 9, 'terie')
dog6 = Dog('Totoshka', 10, 'terier')
# посмотрим, что выведет якобы шестой экземпляр
print(dog6.age) # вывел 10, как будто действительно новый экземпляр со своими свойствами
# сосздадим еще один экземпляр
dog7 = Dog('Totoshka7', 11, 'terier')
# теперь выведем возраст шестого
print(dog6.age) # вывел 11, то есть сменил значение
print(dog7.age) # вывел 11, как и было задано
print(dog5.age) # и этот вывел 11, то есть и он сменил на последнее значение
print(dog1.age) # а здесь до сих пор 5, как и должно быть для первого экземпляра
print(id(dog5), id(dog6), id(dog7)) # вот в чем дело, id совпдают, значит, это все один и тот же экземпляр






