Предизвикателства > Haunted mansion


Haunted mansion
Краен срок: 02.11.2024 21:00
Точки: 1

Хелоуин е и ако не за цяло домашно, сме вдъхновени поне за едно кратко предизвикателство. Повярвайте ни, наистина е кратко, между 15 и 60 минути работа, в зависимост от това колко добре сте запомнили последната лекция. Напишете клас `HauntedMansion`, който има малко по... Хелоуински достъп до атрибутите си: #### Инициализация `HauntedMansion` се инициализира с произволен набор от именувани аргументи: ```py haunted_mansion = HauntedMansion(butler="Alfred", rooms=10, basement=True) ``` Всеки от тези именувани аргументи следва да бъде достъпен в последствие като аргумент, т.е.: ```py print(haunted_mansion.butler) # Би ни върнало "Alfred"... # Ако не беше следващата част от условието ``` #### Достъп до атрибутите Искаме достъпът до атрибутите да работи по следния начин: - Всеки от наличните атрибути ще може да се достъпва само ако е prefix-нат от `spooky_`. С други думи ще имаме `spooky_butler`, `spooky_rooms` и прочие. - Атрибутите **няма** да бъдат достъпни чрез стандартните си имена! При опит за достъп, вместо това ще получаваме като резултат **(не принт, резултат)** низът `"Booooo, only ghosts here!"`. - Динамично добавените атрибути трябва да работят по същия начин. - Това **не** важи за дъндър атрибути, с други думи достъпът до `__dict__` и `__class__`, например, следва да работи нормално. - Няма да тестваме с private атрибути _(горното все пак важи)_, но може да тестваме с protected такива. ```py haunted_mansion = HauntedMansion(butler="Alfred", rooms=10, basement=True) print(haunted_mansion.butler) # Booooo, only ghosts here! print(haunted_mansion.spooky_butler) # Alfred haunted_mansion.friendly_ghost = "Your favourite HP ghost - Nearly Headless Nick" print(haunted_mansion.friendly_ghost) # Booooo, only ghosts here! print(haunted_mansion.spooky_friendly_ghost) # Your favourite HP ghost - Nearly Headless Nick print(haunted_mansion.__class__) # <class '__main__.HauntedMansion'> ``` Fun fact: Ролята на Почтибезглавия Ник в Хари Потър е изиграна от Джон Клийз - един от членовете на Monty Python.
 1import unittest
 2
 3import solution
 4
 5
 6class TestSanity(unittest.TestCase):
 7    """Check if all of the classes are present."""
 8
 9    def test_haunted_mansion(self):
10        self.assertIn('HauntedMansion', dir(solution), 'Убеди се, че класът "HauntedMansion" е наличен с точно това име.')
11        self.assertTrue(isinstance(solution.HauntedMansion, type), 'Убеди се, че "HauntedMansion" е клас.')
12
13
14if __name__ == '__main__':
15    unittest.main()
 1import unittest
 2
 3from solution import HauntedMansion
 4
 5
 6class TestHauntedMansion(unittest.TestCase):
 7    """Test the HauntedMansion class."""
 8
 9    def test_haunted_mansion(self):
10        """The mansion should be really spooky and haunted."""
11        haunted_mansion = HauntedMansion(message="Happy Halloween!", _secret_location=True)
12        self.assertEqual(haunted_mansion.spooky_message, "Happy Halloween!")
13        self.assertTrue(haunted_mansion.spooky__secret_location)
14        self.assertEqual(haunted_mansion.message, "Booooo, only ghosts here!")
15        self.assertEqual(haunted_mansion._secret_room, "Booooo, only ghosts here!")
16
17        haunted_mansion.floors = 5
18        haunted_mansion._secret_floor = "basement"
19        haunted_mansion.spooky_buttler = "Hehe, I said butt..."
20        self.assertEqual(haunted_mansion.spooky_floors, 5)
21        self.assertEqual(haunted_mansion.spooky__secret_floor, "basement")
22        self.assertEqual(haunted_mansion.spooky_spooky_buttler, "Hehe, I said butt...")
23        self.assertEqual(haunted_mansion.floors, "Booooo, only ghosts here!")
24        self.assertEqual(haunted_mansion._secret_floor, "Booooo, only ghosts here!")
25        self.assertEqual(haunted_mansion.spooky_buttler, "Booooo, only ghosts here!")
26
27        self.assertIsInstance(haunted_mansion.__dict__, dict)
28
29if __name__ == "__main__":
30    unittest.main()
Дискусия
Виктор Бечев
02.11.2024 21:43

За тази без коментари - честито, не сме забелязали проблемен код, който да ви индикираме. :)
Георги Кунчев
01.11.2024 17:27

@Стефан_Шиваров, задачата се фокусира върху атрибути на инстанцията, които или са подадени при инициализиране, или сетнати след това, както е в примера за Почтибезглавия Ник. Абстрахирай се от атрибути на класа. В крайна сметка този клас ти го пишеш и такива атрибути не очакваме да има. Да, ние бихме могли да ги добавим динамично, но тъй като не сме дефинирали изисквания за такова поведение, няма да го правим. За въпроса ти за сетването - мисля, че примерът по-горе за Почтибезглавия Ник е показателен и отговаря на въпроса.
Стефан Шиваров
01.11.2024 16:41

Имам два въпроса, свързани със викане на class / static variables / константи за класа: Да речем, че имаме някакво \_MY\_CLASS\_VARIABLE = 4 в класа 1. Ако кажем haunted\_mansion.\_MY\_CLASS\_VARIABLE, oчакваме "Booo....", а при haunted\_mansion.spooky\_\_MY\_CLASS\_VARIABLE -> 4 ? 2. Aко го викнем чрез класа директно, тоест HauntedMansion.\_MY\_CLASS\_VARIABLE и аналогично HauntedMansion.spooky\_\_MY\_CLASS\_VARIABLE, пак ли очакваме същото поведение като при викане от конкретна инстанция? И още един въпрос - нуждаем се от spooky_ префикса само за достъп (get-ване) на атрибута, или и при set-ване, тоест при haunted_mansion.butler = 'New name'
Георги Кунчев
01.11.2024 10:12

`print(HauntedMansion(_nikola_georgiev='Може ли да дадете пример за очаквано поведение при работа с protected атрибути').spooky__nikola_georgiev)`
Никола Георгиев
01.11.2024 09:31

Може ли да дадете пример за очаквано поведение при работа с protected атрибути
Георги Кунчев
01.11.2024 09:13

@Стефан_Шиваров, пак връщаш Boo...
Стефан Шиваров
01.11.2024 00:44

Ако атрибутът, който се опитаме да достъпим, не съществува, трябва да хвърляме AttributeError или пак трябва да върнем "Booooo, only ghosts here!" ?
Георги Кунчев
31.10.2024 23:36

@Димитър_Фенерски, същото, което и с останалите. Просто при поискване ще имаш повторение на "spooky_" частта. Напрамер: `print(HauntedMansion(spooky_arg='Наближава полунощ!').spooky_spooky_arg) # Наближава полунощ!`
Димитър Фенерски
31.10.2024 22:54

Ако "обикновеното" име започва със "spooky_" какво трябва да се случва?