Skip to content

Commit dec8876

Browse files
author
Gennadii Kandaurov
committed
add lesson #04 slides, hw
1 parent 323ea62 commit dec8876

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
01. [Введение, типы данных, управляющие конструкции, тестирование](lesson-01)
66
02. [Функции](lesson-02)
77
03. [Классы, ООП](lesson-03)
8+
04. [Дескрипторы, метапрограммироование, ABC](lesson-04)
89

910

1011
## Правила оформления домашек на github

lesson-02/homework.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def process_json(
2323
json_str: str,
2424
required_keys: list[str] | None = None,
2525
tokens: list[str] | None = None,
26-
callback: Callable[[str, str], None] | None = None,
26+
callback: Callable[[str, str], Any] | None = None,
2727
) -> None:
2828
...
2929

lesson-04/homework.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Домашнее задание #04 (дескрипторы, метаклассы, ABC)
2+
3+
### 1. Метакласс, который в начале названий всех атрибутов и методов, кроме магических, добавляет префикс "custom_"
4+
Подменяться должны атрибуты класса и атрибуты экземпляра класса, в том числе добавленные после выполнения конструктора (dynamic в примере).
5+
6+
```py
7+
class CustomMeta(...):
8+
pass
9+
10+
11+
class CustomClass(metaclass=CustomMeta):
12+
x = 50
13+
14+
def __init__(self, val=99):
15+
self.val = val
16+
17+
def line(self):
18+
return 100
19+
20+
def __str__(self):
21+
return "Custom_by_metaclass"
22+
23+
24+
assert CustomClass.custom_x == 50
25+
CustomClass.x # ошибка
26+
27+
inst = CustomClass()
28+
assert inst.custom_x == 50
29+
assert inst.custom_val == 99
30+
assert inst.custom_line() == 100
31+
assert str(inst) == "Custom_by_metaclass"
32+
33+
inst.x # ошибка
34+
inst.val # ошибка
35+
inst.line() # ошибка
36+
inst.yyy # ошибка
37+
38+
inst.dynamic = "added later"
39+
assert inst.custom_dynamic == "added later"
40+
inst.dynamic # ошибка
41+
```
42+
43+
44+
### 2. Дескрипторы с проверками типов и значений данных
45+
Нужно сделать три дескриптора для какой-то области интереса (наука, финансы, хобби и тд), но если совсем не получается, то можно использовать шаблона ниже в качестве основы.
46+
У дескрипторов должен быть базовый класс с абстрактным методом-проверкой, который наследующие классы должны будут реализовать.
47+
48+
```py
49+
class Base...:
50+
pass
51+
52+
class Integer:
53+
pass
54+
55+
class String:
56+
pass
57+
58+
class PositiveInteger:
59+
pass
60+
61+
class Data:
62+
num = Integer()
63+
name = String()
64+
price = PositiveInteger()
65+
66+
def __init__(...):
67+
....
68+
```
69+
70+
71+
### 3. Тесты метакласса и дескрипторов в отдельных модулях
72+
73+
### 4. Зеленый пайплайн в репе
74+
Обязательно: тесты, покрытие, flake8, pylint.
75+
Опционально можно добавить другие инструменты, например, mypy и black.
76+
Покрытие тестов должно составлять не менее 90%.

lesson-04/lesson-04.pdf

716 KB
Binary file not shown.

0 commit comments

Comments
 (0)