Бяхме ви обещали нещо в една от новините за курса преди време и, въпреки че нарушихме обещанието да ви водим лекция, пълна с Gen Alpha slang, мислим предходното обещание да го спазим... Било то и с ден закъснение _(всъщност започнахме да пишем предизвикателството вчера, но така се случи)_. Та...
Вчера беше [международният ден на курвите](https://en.wikipedia.org/wiki/International_Whores%27_Day). Не сме непременно фенове на Pride Month, но първи и втори юни можем да ги оценим.
**Дисклеймър**: Не сме простаци и шовинисти, затова като казваме "курва" имаме предвид "жена, която извършва сексуални актове с други хора срещу заплащане". Нямаме предвид просто жена, която спи с всички наред, това е просто Мария _(да, проверихме дали в курса има Мария, преди да подберем името)_.
Можете да прочетете за вчерашния празник в статията по-горе, но накратко - преди 51 години на вчерашната дата е имало бунт на френските проститутки, целящ да привлече вниманието към нечовешките работни условия на най-древната професия. Малко като протестите пред народното, ама обратното - при тях курвите стоят вътре.
Бяхме ви подготвили актова фотография, но тъй като това е предизвикателство, а не домашно - няма да качваме картинка. Отвъд това, останалото знаете как работи...
#### Задачата
Искаме от вас да напишете клас `Slot`, който да може да се използва по следния начин:
```
class Whore:
front = Slot(object_limit=2)
back = Slot(size_limit=15)
top = Slot()
```
##### Употреба
Искаме да можем да вкарваме обекти във всеки `Slot` и те да се запазват в него според следния интерфейс:
```
# С така дефинирания клас Whore от по-горе
whore = Whore()
whore.front = "something"
print(whore.front) # ("something",)
whore.front = "something else"
print(whore.front) # ("something", "something else")
print(whore.back) # ()
```
С други думи, при операцията `=` към атрибут, който е слот - предметът от дясната страна бива вкаран в слота. Когато искаме да четем слот - получаваме `tuple` с всички обекти в него.
Освен това искаме да дефинираме и изваждане на обекти от слот, чрез ключовата "дума" `del`:
```
# Примерът продължава
print(whore.front) # ("something", "something else")
del whore.front
print(whore.front) # ("something else", )
```
С други думи, обектите се вадят от слотовете в реда на вкарването им (опашка). А ако се опитаме да извадим обект от празен слот, операцията не трябва да прави нищо и не трябва да хвърля грешка.
##### Лимити
Както си личи от първия пример, искаме класът да може да приема опционални аргументи `object_limit` и `size_limit`:
- `object_limit` определя колко предмета може да поеме слотът.
- `size_limit` определя максималната сума от размерите на всички предмети, които може да поеме слотът.
При:
- Опит за вкарване на предмет, който би довел до превишаване на лимита за брой предмети;
- Опит за вкарване на предмет, който би довел до превишаване на лимита за общ размер на предметите;
Искаме да се хвърли грешка:
```
# За припомняне
class Whore:
front = Slot(object_limit=2)
back = Slot(size_limit=15)
top = Slot()
whore = Whore()
whore.front = "something"
whore.front = "something else"
print(whore.front) # ("something", "something else")
whore.front = "a third something" # ValueError: Вие си решавате.
print(whore.front) # ("something", "something else")
whore.back = "one thing"
whore.back = "another, very big thing" # ValueError: Пак вие си решавате.
```
**Уточнение** - "общ размер на предметите" ще рече сумата на дължините на всеки предмет. С други думи, нямате гаранция, че всеки предмет, който се опитаме да вкараме в слота ще бъде низ, но имате гаранция, че всеки предмет, който се опитаме да вкараме, ще има дефинирано поведение за `len(object)`.
**Уточнение 2** - и двата лимита са включителни - `<=`.
#### Важна уговорка
Съдържанието на всеки слот трябва да бъде независимо за всяка инстанция.
Пример:
```python
first = Whore()
second = Whore()
first.front = "something"
print(first.front) # ("something",)
print(second.front) # ()
```
#### Въпроси?
В коментарите, както винаги.